鎖是計算機的一個術語,“鎖”是一種思想,但是不同領域有不同的實現方式。對於Java中的線程同步來說,鎖有兩種:一、對象鎖 ; 二、類鎖;
對象鎖作用於類中的非靜態同步方法,對非同步方法沒任何作用。
在Java平台內部,會為每個對象分配一個對象鎖。鎖有兩種狀態 開著的(鎖屬於對象),鎖上(鎖屬於線程)
Java平台實現方法同步原則如下:
1、當一個線程要通過一個對象引用調用同步方法時候,線程會向Java平台申請鎖;鎖如果開著的,Java平台鎖上這個對象鎖,線程獲得對象鎖。
2、如果對象鎖是鎖著的,那麼申請對象鎖的線程需要等有對象鎖的線程打開對象鎖
3、在線程獲得了對象鎖後,Java平台就允許線程以一個對象引用去訪問對象實例范圍內的任何同步方法
4、線程執行完畢同步方法後,必須歸還對象鎖,也即打開對象鎖供其他線程使用。
5、當對象鎖打開後,Java平台將是否有線程等待對象鎖,有就將對象鎖鎖上給這個線程。然後喚醒線程繼續執行。如果沒有對象鎖歸還對象實體。
對於類鎖和對象鎖唯一不同的是有靜態同步方法的類才有一個類鎖。處理流程和對象鎖一樣。