鎖 synchronized關鍵字

2022-06-27 10:51:12 字數 1707 閱讀 1838

必須掌握知識點:

(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張票,而另外兩...