必須掌握知識點:
(1)synchronized修飾普通方法:在修飾普通方法的時候,這個鎖是當前例項物件,即物件鎖。
也就是說,這個鎖只對當前的物件例項建立的執行緒有效,若我們在程式中建立多個物件例項,不同例項分別建立乙個執行緒,這時候這些執行緒都能同時進到這個方法裡,也就是說這個物件鎖,只對當前例項執行緒有效,多個例項就無效了。
如下**,就是修飾普通方法,但是鎖是無效的,因為這個已經是不同例項了。要想使鎖有效,要保證執行緒的建立者同屬於乙個例項物件。
//鎖失效public classdemo1
}public static void main(string args) throwsinterruptedexception );
thread t2 = new thread(()->);
thread t3 = new thread(()->);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
system.out.println(num);
}}
//鎖有效public classdemo1
}public static void main(string args) throwsinterruptedexception
}
(2)synchronized修飾靜態方法:鎖是當前類class物件,即類鎖,全域性鎖。
也就是說,這個鎖對於不同例項建立的執行緒均有效。
public classdemo1}public static class t1 extendsthread
}public static void main(string args) throwsinterruptedexception
}
(3)同步**塊,synchronize(class物件){}:這時候這個鎖是全域性鎖,對不同例項建立的執行緒依然有效。
public classdemo1 }}public static void main(string args) throwsinterruptedexception );
thread t2 = new thread(()->);
thread t3 = new thread(()->);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
system.out.println(num);
}}
(4)同步**塊,synchronize(this){}:傳入的物件為當前例項的時候,這時候就是物件鎖,鎖只對當前例項建立的執行緒有效。
public classdemo1 }}public static void main(string args) throwsinterruptedexception
}
參考部落格: 這個寫的比較深入,比較好
參考部落格:
執行緒鎖關鍵字 synchronized
static config instance nil config instance return instance id allocwithzone nszone zone returnnil 在上面兩個例子中都用到 關鍵字 synchronized,這裡大概說一下 通過 synchronized...
執行緒鎖 synchronized
使用 synchronized解決執行緒同步問題相比較nslock要簡單一些,日常開發中也更推薦使用此方法。首先選擇乙個物件作為同步物件 一般使用self 然後將 加鎖 爭奪資源的讀取 修改 放到 塊中。synchronized中的 執行時先檢查同步物件是否被另乙個執行緒占用,如果占用該執行緒就會處...
執行緒之 鎖 synchronized鎖
多執行緒中有寫程式是由一寫bug的,學習執行緒鎖,很經典的例子,買票案例 有a,b,c三個視窗,同時售賣100張票,最後可能會出現賣了重複的票,或者多賣了,賣超了等執行緒不安全問題 看乙個執行緒不安全的賣票 小明,小張,小王同時去買票,就會出現上面的執行緒不安全問題,因為,視窗1賣了1張票,而另外兩...