Java互斥鎖synchronized

互斥鎖是JDK6中引入的新特性 

使用規則

一、鎖對象設置

a、修飾代碼塊時,需要設置一個引用類型對象作爲鎖的同步監視器對象

b、修飾實例方法時,默認的同步監視器對象是當前對象

c、修飾類方法(靜態方法)時、默認的同步監視器對象是當前類的Class對象

二、根據鎖對象的不同,一把鎖同時最多隻能被一個線程擁有

a、若鎖對象已被當前線程持有,則其他線程需要等待持有鎖的線程釋放鎖後才能繼續執行,否則就阻塞

b、synchronized 添加在方法上時只針對該方法在多線程同步執行時只有一個在運行,其他線程使用對象內的其他沒有添加synchronized 的方法可以正常使用

示例

當 synchronized 鎖住多段不同的代碼片段時,如果這些代碼塊使用的鎖對象是同一個時

那麼這些代碼片段之間就是互斥的,多個線程不能同時執行他們

當 synchronized 添加在方法上時就以當前對象作爲鎖對象,如果是靜態方法則以當前類的Class對象做爲鎖對象

    public static synchronized void a() {
        System.out.println("a執行中");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static synchronized void b() {
        System.out.println("b執行中");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static synchronized void main(String[] args) {
        Thread a = new Thread(() -> {
            for(int i=0;i<10;i++) {
                a();
            }
        });
        Thread b = new Thread(() -> {
            for(int i=0;i<10;i++) {
                b();
            }
        });
        a.start();
        b.start();
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章