java鎖的到底是鎖的什麼??

鎖作用的對象

類代碼塊鎖

對多個線程使用的多個此類A的代碼加鎖,即使多個線程多個對象也 會只有一個線程進入到此代碼塊,與對象個數,線程個數無關。

實現方式

(1)類代碼塊 synchronized(A.class){}

(2)靜態lock對象 static  Lock lock=new ReetrantLock();

類對象鎖

對多個線程使用的同一個類A對象加鎖,與線程個數無關,多個線程中必須使用同一個類A對象,纔會同步線程。

實現方式

(1)對象代碼塊 synchronized(this){}

(2)非靜態方法 public void synchronized xx(){}

(3) 非靜態lock對象 Lock lock=new ReetrantLock()

Synchronized 鎖

1、synchronized加在非靜態方法前和synchronized(this)都是鎖住了這個類的對象,如果多線程訪問,對象不同,就鎖不住,對象固定是一個,就可鎖住。

2、synchronized(類名.class)以及加在靜態方法前,是鎖住了代碼塊,不管多線程訪問的時候對象是不是同一個,能縮小代碼段的範圍就儘量縮小,能在代碼段上加同步就不要再整個方法上加同步,縮小鎖的粒度。

lock鎖

前面加static如 static Lock lock = new ReentrantLock(); 是對代碼塊加鎖,若不加static是對對象加鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章