Java併發編程入門(六)synchronized用法

Java極客  |  做者  /  鏗然一葉
這是Java極客的第 34 篇原創文章

1、做用域

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;
        }
    }
複製代碼

2、加鎖對象

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);
        }
    }
}
複製代碼

3、關鍵點

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

相關文章
相關標籤/搜索