1. 程式人生 > >Java的sychronized鎖中物件鎖和類鎖的區別

Java的sychronized鎖中物件鎖和類鎖的區別

  4. 同步加鎖的是物件,而不是程式碼。因此,如果你的類中有一個同步方法,這個方法可以被兩個不同的執行緒同時執行,只要每個執行緒自己建立一個的該類的例項即可。

  5. 不同的物件例項的synchronized方法是不相干擾的。也就是說,其它執行緒照樣可以同時訪問相同類的另一個物件例項中的synchronized方法。

  6. synchronized關鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中並不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個方法為synchronized方法。

  7.對一個全域性物件或者類加鎖時,對該類的所有物件都起作用。

類鎖舉例

對一個全域性變數加鎖:

1 public class MySynchronized extends Thread2 {3     private int val;4    5     private static Object lock = new Object();6    7     public MySynchronized(int v)8     {9         val = v;10     }11    12     public void printVal(int v)13     {14         synchronized (lock)15         {16
             while (true)17             {18                 System.out.println(v);19             }20         }21     }22    23     public void run()24     {25         printVal(val);26     }27 }

  對整個類加鎖:

複製程式碼
1 public class MySynchronized extends Thread
 2 {
 3     private int val;
 4     
 5     public MySynchronized(int
v) 6 { 7 val = v; 8 } 9 10 public void printVal(int v) 11 { 12 synchronized (MySynchronized.class) 13 { 14 while (true) 15 { 16 System.out.println(v); 17 } 18 } 19 } 20 21 public void run() 22 { 23 printVal(val); 24 } 25 }
複製程式碼

另外的鎖例子:

String常量的特殊性,屬於同一個物件。

public class MySynchronized extends Thread{private String name;private String val;public MySynchronized(String name, String v){this.name = name;val = v;}public void printVal(){synchronized (val){while (true){System.out.println(name + val);}}}public void run(){printVal();}public static void main(String args[]){MySynchronized f1 = new MySynchronized("Foo 1:", "printVal");f1.start();MySynchronized f2 = new MySynchronized("Foo 2:", "printVal");f2.start();}}

synchronized作用於靜態方法和非靜態方法的區別: 

123456789/**  非靜態方法:*  給物件加鎖(可以理解為給這個物件的記憶體上鎖,注意 只是這塊記憶體,其他同類物件都會有各自的記憶體鎖),這時候* 在其他一個以上執行緒中執行該物件的這個同步方法(注意:是該物件)就會產生互斥*  靜態方法: * 相當於在類上加鎖(*.class 位於程式碼區,靜態方法位於靜態區域,這個類產生的物件公用這個靜態方法,所以這塊* 記憶體,N個物件來競爭), 這時候,只要是這個類產生的物件,在呼叫這個靜態方法時都會產生互斥*/