Synchronized 有幾種用法?
阿新 • • 發佈:2018-12-13
我們都知道 Synchronized 是執行緒安全同步用的,大部分程式可能只會用到同步方法上面。其實 Synchronized 可以用到更多的場合,棧長列舉了以下幾個用法。
1、同步普通方法
這個也是我們用得最多的,只要涉及執行緒安全,上來就給方法來個同步鎖。這種方法使用雖然最簡單,但是隻能作用在單例上面,如果不是單例,同步方法鎖將失效。
/** * 用在普通方法 */ private synchronized void synchronizedMethod() { System.out.println("synchronizedMethod"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }
此時,同一個例項只有一個執行緒能獲取鎖進入這個方法。
2、同步靜態方法
同步靜態方法,不管你有多少個類例項,同時只有一個執行緒能獲取鎖進入這個方法。
/** * 用在靜態方法 */ private synchronized static void synchronizedStaticMethod() { System.out.println("synchronizedStaticMethod"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }
同步靜態方法是類級別的鎖,一旦任何一個執行緒進入這個方法,其他所有執行緒將無法訪問這個類的任何同步類鎖的方法。
3、同步類
下面提供了兩種同步類的方法,鎖住效果和同步靜態方法一樣,都是類級別的鎖,同時只有一個執行緒能訪問帶有同步類鎖的方法。
/** * 用在類 */ private void synchronizedClass() { synchronized (TestSynchronized.class) { System.out.println("synchronizedClass"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 用在類 */ private void synchronizedGetClass() { synchronized (this.getClass()) { System.out.println("synchronizedGetClass"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }
這裡的兩種用法是同步塊的用法,這裡表示只有獲取到這個類鎖才能進入這個程式碼塊。
4、同步this例項
這也是同步塊的用法,表示鎖住整個當前物件例項,只有獲取到這個例項的鎖才能進入這個方法。
/**
* 用在this
*/
private void synchronizedThis() {
synchronized (this) {
System.out.println("synchronizedThis");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
用法和同步普通方法鎖一樣,都是鎖住整個當前例項。
5、同步物件例項
這也是同步塊的用法,和上面的鎖住當前例項一樣,這裡表示鎖住整個 LOCK 物件例項,只有獲取到這個 LOCK 例項的鎖才能進入這個方法。
/**
* 用在物件
*/
private void synchronizedInstance() {
synchronized (LOCK) {
System.out.println("synchronizedInstance");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
另外,類鎖與例項鎖不相互阻塞,但相同的類鎖,相同的當前例項鎖,相同的物件鎖會相互阻塞。
關於 Synchronized 的幾種用法棧長就介紹到這裡了,如果你還知道其他的用法,歡迎留言。