線程同步

package com.yhh.chap2;

public class TraditionalThreadSynchronized {

/**

* @param args

*/

public static void main(String[] args) {

new TraditionalThreadSynchronized().init();

}

private void init(){

final Outputer outputer = new Outputer();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output("zhangxiaoxiang");

}

}

}).start();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output2("lihuoming");

}

}

}).start();

}

class Outputer{

public void output(String name){

int len = name.length();

synchronized(this) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

public void output2(String name){

int len = name.length();

synchronized(this) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

}

}

也可以寫(xiě)成以下:


package com.yhh.chap2;

public class TraditionalThreadSynchronized {

/**

* @param args

*/

public static void main(String[] args) {

new TraditionalThreadSynchronized().init();

}

private void init(){

final Outputer outputer = new Outputer();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output("zhangxiaoxiang");

}

}

}).start();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output2("lihuoming");

}

}

}).start();

}

class Outputer{

public void output(String name){

int len = name.length();

synchronized(this) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

//也是代表加的鎖是調(diào)用此方法的當(dāng)前對(duì)象outputer

public synchronized void output2(String name){

int len = name.length();

// synchronized(this) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

// }

}

}

}

此時(shí)上面synchronized(里面代表的是同一個(gè)outputer對(duì)象)結(jié)果正常:

lihuoming

zhangxiaoxiang

zhangxiaoxiang

lihuoming

lihuoming

zhangxiaoxiang

zhangxiaoxiang

lihuoming



package com.yhh.chap2;

public class TraditionalThreadSynchronized {

/**

* @param args

*/

public static void main(String[] args) {

new TraditionalThreadSynchronized().init();

}

private void init(){

final Outputer outputer = new Outputer();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

new Outputer().output("zhangxiaoxiang");

}

}

}).start();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output2("lihuoming");

}

}

}).start();

}

class Outputer{

public void output(String name){

int len = name.length();

synchronized(this) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

public void output2(String name){

int len = name.length();

synchronized(this) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

}

}

此時(shí)上面synchronized(里面不是同一個(gè)對(duì)象,第一個(gè)是new了一個(gè)新對(duì)象,第二個(gè)是outputer)

所以結(jié)果:出現(xiàn)問(wèn)題

lihuoming

lihuoming

zhangxiaoxiang

zhangxiaoxlihuoming

iang

lihuoming

zhangxiaoxiang

lihuozhaminngxiaoxig

ang


package com.yhh.chap2;

public class TraditionalThreadSynchronized {

/**

* @param args

*/

public static void main(String[] args) {

new TraditionalThreadSynchronized().init();

}

private void init(){

final Outputer outputer = new Outputer();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output("zhangxiaoxiang");

}

}

}).start();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output2("lihuoming");

}

}

}).start();

}

class Outputer{

public void output(String name){

int len = name.length();

synchronized(Outputer.class) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

public void output2(String name){

int len = name.length();

synchronized(Outputer.class) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

}

}

此時(shí)上面調(diào)用方法的對(duì)象是同一個(gè)outputer,synchronized(里面加的是唯一的字節(jié)碼)

沒(méi)有問(wèn)題:

zhangxiaoxiang

lihuoming

lihuoming

zhangxiaoxiang

zhangxiaoxiang

lihuoming

zhangxiaoxiang

lihuoming

zhangxiaoxiang



package com.yhh.chap2;

public class TraditionalThreadSynchronized {

/**

* @param args

*/

public static void main(String[] args) {

new TraditionalThreadSynchronized().init();

}

private void init(){

final Outputer outputer = new Outputer();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

new Outputer().output("zhangxiaoxiang");

}

}

}).start();

new Thread(new Runnable(){

@Override

public void run() {

while(true){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

outputer.output2("lihuoming");

}

}

}).start();

}

class Outputer{

public void output(String name){

int len = name.length();

synchronized(Outputer.class) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

public void output2(String name){

int len = name.length();

synchronized(Outputer.class) {

for(int i=0;i<len;i++){

System.out.print(name.charAt(i));

}

System.out.println();

}

}

}

}

此時(shí)上面調(diào)用方法的對(duì)象不是同一個(gè),但synchronized(Outputer.class)是一樣的所以沒(méi)得問(wèn)題:

zhangxiaoxiang

lihuoming

lihuoming

zhangxiaoxiang

zhangxiaoxiang

lihuoming

zhangxiaoxiang

lihuoming

zhangxiaoxiang



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容