Synchronized 的使用(物件鎖 類

2021-07-25 11:16:31 字數 4035 閱讀 8398

下面貼幾個例項來具體驗證下:

預設情況下 synchronized 修飾的非靜態方法,其鎖為 this,與  synchronized(this) 效果一樣:

public class synchronized 

public static void synctest(final synchronized sync1, final synchronized sync2)

}, "th-1");

th1.start();

thread th2 = new thread(new runnable()

}, "th-2");

th2.start();

}/**

* 同步方法一

*/public synchronized void sync1()

} catch (interruptedexception e)

system.out.println("sync1 is end");

}/**

* 同步方法二

*/public synchronized void sync2()

} catch (interruptedexception e)

system.out.println("sync2 is end");

}}

上面是對非靜態 synchronized 的方法。

下面是靜態的 synchronized 執行結果:

預設情況下,synchronized 修飾的靜態方法,其鎖為 類.class

public class synchronized 

public static void synctest(final synchronized sync1, final synchronized sync2)

}, "th-1");

th1.start();

thread th2 = new thread(new runnable()

}, "th-2");

th2.start();

}/**

* 同步方法一

*/public static synchronized void sync1()

} catch (interruptedexception e)

system.out.println("sync1 is end");

}/**

* 同步方法二

*/public static synchronized void sync2()

} catch (interruptedexception e)

system.out.println("sync2 is end");

}}

對於 synchronized 修飾的靜態方法,因為其鎖預設為 類.class,所以在多個執行緒同時執行時,會存在鎖競爭的情況,所以會阻塞

下面是對 synchronized(例項物件) 的使用:

public class synchronized2 

}, "th-1");

thread th2 = new thread(new runnable()

}, "th-2");

th1.start();

th2.start();

}public void synctest(object sync)

} catch (interruptedexception e) }}

}

上面**執行結果為:

ob1 == ob2: true

ob1.hashcode() == ob2.hashcode(): true

thread name : th-1

th-1 : 0

th-1 : 1

th-1 : 2

thread name : th-2

th-2 : 0

th-2 : 1

th-2 : 2

原因是:兩個執行緒競爭的鎖是同乙個鎖,因為 ob1==ob2  結果為true。

下面看,如果把上面的

string ob1 = new string("sync");

string ob2 = ob1;

改為:

string ob1 = new string("sync");string ob2 = new string("sync");

結果就為:

ob1 == ob2: false

ob1.hashcode() == ob2.hashcode(): true

thread name : th-2

th-2 : 0

thread name : th-1

th-1 : 0

th-1 : 1

th-2 : 1

th-2 : 2

th-1 : 2

因為此時兩個執行緒競爭的鎖不為同乙個鎖,所以不存在鎖競爭。

下面的例項來自網上,原文出自(抱歉,沒有儲存到)

public class run 

}class service

public void setusernamepassword(string username, string password)

} catch (interruptedexception e)

}}class threada extends thread

@override

public void run()

}class threadb extends thread

@override

public void run()

}

執行結果為:

執行緒名稱為:a在1482044312482進入同步塊

執行緒名稱為:a在1482044313483離開同步塊

執行緒名稱為:b在1482044313483進入同步塊

執行緒名稱為:b在1482044314483離開同步塊

因為作為鎖的物件為同乙個物件  service1 的  anystring 物件,所以存在鎖競爭,所以兩個程序會按順序輸出

如果我將 main 方法改為如下,結果會是什麼呢:

public static void main(string args)

這次我傳的物件為兩個不同的物件,那麼輸出結果是什麼呢?答案是不變的:

true

執行緒名稱為:a在1482044611516進入同步塊

執行緒名稱為:a在1482044612517離開同步塊

執行緒名稱為:b在1482044612517進入同步塊

執行緒名稱為:b在1482044613518離開同步塊

因為這個例子中,作為鎖的不是 兩個 service1 與 service2,而是其中的  anystring 字串物件。寫到這,可能細心的讀者會發現,在用 string 型別作為鎖時,一定要注意,因為在jvm 中存在乙個 字串常量池 的記憶體區域,這就涉及到有關 string 的記憶體空間分配的問題了,如:

string  str1 =  "12345";

string  str2 = new  string("12345");

string  str3 = "12345".intern();

他們直接先後順序不一樣,變數的記憶體位址也是不一樣的

synchronized的使用總結

synchronized的基本使用規則可總結為以下3條。1.當乙個執行緒訪問 某物件 的 synchronized方法 或者 synchronized 塊 時,其他執行緒對 該物件 的該 synchronized方法 或者 synchronized 塊 的訪問將被阻塞。2.當乙個執行緒訪問 某物件 ...

執行緒 synchronized的使用

synchronized public class sync override public void run public void pf int i catch interruptedexception e system.err.println i new date gettime public...

使用 synchronized指令

使用 synchronized指令 synchronized 指令是在 objective c 中建立乙個互斥鎖非常方便的方法。synchronized 指令做和其他互斥鎖一樣的工作 它防止不同的執行緒在同一時間獲取同乙個鎖 然而在這種情況下,你不需要直接建立乙個互斥鎖或鎖物件。相反,你只需要簡單的...