最近研究線程方面問題,關於這個synchronized鎖修飾的問題,先是修飾普通方法,然后通過兩個線程,各自執行自己對象的鎖,發現方法執行互不影響,代碼如下:
private static int num=0;
private synchronized void printNum(String tag){
try {
if(tag.equals("a")){
num=100;
System.out.println("tag a,num set over!");
Thread.sleep(1000);//休眠1秒
}else{
num=200;
System.out.println("tag b,set num over!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("tag :" +tag+", num="+num);
}
public static void main(String[] args) {
MyThread02 my1=new MyThread02();
MyThread02 my2=new MyThread02();
//匿名內部類方式啟動線程
new Thread(()->my1.printNum("a")).start();
new Thread(()->my2.printNum("b")).start();
},
執行結果如下,即可能一個線程剛設置完num,另一個線程來再來設置num,兩個線程兩個鎖沒有任何影響.
tag a,num set over!
tag b,set num over!
tag :b, num=200
tag :a, num=200
但是如果修飾的是靜態方法,發現打印順序就是一致的,也就是說此時這個方法同時只能一個線程執行,結果不變如下:
tag a,num set over!
tag :a, num=100
tag b,set num over!
tag :b, num=200
后面百度了解到,在多個線程多個鎖的情況下,
如果synchronized修飾在普通方法上,線程之間互無關系,可任意執行自己對象的鎖
如果在static方法上修飾synchronized表示鎖定了class類.多個線程都是相同的一把鎖,即
取得的鎖都是對象鎖,哪個線程先執行代碼,哪個線程就持有該方法所屬的對象鎖,其他對象就無法執行