synchronized和lock的區別

先說一下什麼是同步(synchronized和lock都是實現這個的):     

     每一個對象都有一個互斥的鎖標記和一個鎖池,哪個線程擁有鎖標記哪個才能訪問,沒有鎖標記的線程就進入鎖池,保證同步代碼塊中只有一個線程

     synchronized修飾的代碼塊是對括號內的對象加鎖,只有擁有鎖標記的線程能訪問;

     synchronized修飾的函數方法是整個方法範圍內對當前對象的加鎖,也是隻有擁有鎖標記的才能訪問,儘量少用;

     一個線程可以對應多個鎖標記,但是一個鎖標記只能一個時刻內對應一個線程;但一個線程也不宜對應過多的鎖標記,容易造成死鎖;

     靜態方法可以是同步對象,但鎖的不是類對象,而是當前對象;

     抽象方法和構造方法不能是synchronized的同步的方法;

     線程如果拿不到鎖標記的話就進入鎖池(lock pool),每個對象都有一個自己的鎖池的空間,來存儲等待的線程,由系統決定哪個線程獲得鎖標記;

     線程間的通信使用的空間稱爲等待隊列(wait pool),該隊列和(lock pool)一樣都是對象自己的空間,線程調用wait方法之後,該線程就進入wait pool中,這個具體的在下一篇裏說;

下面說兩個的異同:

相同點:lock能實現synchronized實現的所有功能。。。。。尷尬

不同點:lock有更精確的線程語義和性能,但是必須要求程序員手動釋放,而且一定要在finally從句中釋放,它的trylock方法可以以非阻塞方式拿鎖;

                synchronized會自動釋放鎖;

33


發佈了61 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章