synchronized關鍵字的做用域有:
1.靜態方法java
public static synchronized void increase() {
count = count + 1;
}
複製代碼
2.實例方法編程
public synchronized int getCount() {
return count;
}
複製代碼
3.代碼塊緩存
public static void decrease() {
synchronized (SynchronizedDemo.class) {
count = count - 1;
}
}
複製代碼
synchronized加鎖的對象有:
1.鎖定的對象爲類類型
2.鎖定的對象爲類實例對象
例如:安全
public class SynchronizedDemo {
private static int count = 0;
//鎖定對象爲SynchronizedDemo.class
public static synchronized void increase() {
count = count + 1;
}
public static void decrease() {
//鎖定對象爲SynchronizedDemo.class
synchronized (SynchronizedDemo.class) {
count = count - 1;
}
}
//鎖定對象爲爲SynchronizedDemo類的某個實例
public synchronized int getCount() {
return count;
}
public void print() {
//鎖定對象爲SynchronizedDemo類的某個實例
synchronized (this) {
System.out.println(count);
}
}
}
複製代碼
1.synchronized加鎖互斥且阻塞的,若是A已經得到鎖,則B要等A執行完後才能執行。
2.鎖定的對象若是不是同一個則不會阻塞,例如在同一個類的靜態方法和實例方法上都有synchronized關鍵字,但它們不是同一個鎖,所以互不影響。
3.鎖定的對象必須是不變的,不然鎖會發生變化,致使併發時處理結果不正確。併發
end.post
相關閱讀:
Java併發編程(一)知識地圖
Java併發編程(二)原子性
Java併發編程(三)可見性
Java併發編程(四)有序性
Java併發編程(五)建立線程方式概覽
Java併發編程入門(七)輕鬆理解wait和notify以及使用場景
Java併發編程入門(八)線程生命週期
Java併發編程入門(九)死鎖和死鎖定位
Java併發編程入門(十)鎖優化
Java併發編程入門(十一)限流場景和Spring限流器實現
Java併發編程入門(十二)生產者和消費者模式-代碼模板
Java併發編程入門(十三)讀寫鎖和緩存模板
Java併發編程入門(十四)CountDownLatch應用場景
Java併發編程入門(十五)CyclicBarrier應用場景
Java併發編程入門(十六)秒懂線程池差異
Java併發編程入門(十七)一圖掌握線程經常使用類和接口
Java併發編程入門(十八)再論線程安全優化
Java極客站點: javageektour.com/this