先說一下什麼是同步(synchronized和lock都是實現這個的):
每一個對象都有一個互斥的鎖標記和一個鎖池,哪個線程擁有鎖標記哪個才能訪問,沒有鎖標記的線程就進入鎖池,保證同步代碼塊中只有一個線程
synchronized修飾的代碼塊是對括號內的對象加鎖,只有擁有鎖標記的線程能訪問;
synchronized修飾的函數方法是整個方法範圍內對當前對象的加鎖,也是隻有擁有鎖標記的才能訪問,儘量少用;
一個線程可以對應多個鎖標記,但是一個鎖標記只能一個時刻內對應一個線程;但一個線程也不宜對應過多的鎖標記,容易造成死鎖;
靜態方法可以是同步對象,但鎖的不是類對象,而是當前對象;
抽象方法和構造方法不能是synchronized的同步的方法;
線程如果拿不到鎖標記的話就進入鎖池(lock pool),每個對象都有一個自己的鎖池的空間,來存儲等待的線程,由系統決定哪個線程獲得鎖標記;
線程間的通信使用的空間稱爲等待隊列(wait pool),該隊列和(lock pool)一樣都是對象自己的空間,線程調用wait方法之後,該線程就進入wait pool中,這個具體的在下一篇裏說;
下面說兩個的異同:
相同點:lock能實現synchronized實現的所有功能。。。。。
不同點:lock有更精確的線程語義和性能,但是必須要求程序員手動釋放,而且一定要在finally從句中釋放,它的trylock方法可以以非阻塞方式拿鎖;
synchronized會自動釋放鎖;