鎖作用的對象
類代碼塊鎖
對多個線程使用的多個此類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是對對象加鎖。