国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

synchronized 到底鎖的是誰?

這篇具有很好參考價值的文章主要介紹了synchronized 到底鎖的是誰?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

synchronized 到底鎖的是誰?
修飾方法:
1、靜態(tài)方法
2、非靜態(tài)方法,鎖住的是方法的調(diào)用者
修飾代碼塊

1、synchronized修飾非靜態(tài)方法 鎖住的是方法的調(diào)用者

鎖住實例

流程:
1、線程A先拿到synModel對象然后給這個 synModel對象加上鎖–接著等3s執(zhí)行輸出結(jié)束
2、線程B等1s后運行,此時 synModel對象 已經(jīng)被 A拿到,所以他只能等待 等3s后,線程A釋放 synModel對象,然后獲取對象執(zhí)行輸出結(jié)束

public class SynchronizedTest {

    public static void main(String[] args) throws InterruptedException {
        SynModel synModel = new SynModel();
        new Thread(()->{
            synModel.fun1();
        },"A").start();

        TimeUnit.SECONDS.sleep(1);
        new Thread(()->{
            synModel.fun2();
        },"B").start();
    }
}
class SynModel{

    public synchronized void fun1()  {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("1...");
    }
    public synchronized void fun2(){
        System.out.println("2...");
    }
}

情況1 不會排隊

注意:下面這種情況是不會排隊的,因為鎖的是實例。

public class SynchronizedTest {

    public static void main(String[] args) throws InterruptedException {
        SynModel synModel1 = new SynModel();
        SynModel synModel2 = new SynModel();
        new Thread(()->{
            synModel1.fun1();
        },"A").start();

        TimeUnit.SECONDS.sleep(1);
        new Thread(()->{
            synModel2.fun2();
        },"B").start();
    }
}
class SynModel{

    public  synchronized void fun1()  {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("1...");
    }
    public  synchronized void fun2(){
        System.out.println("2...");
    }
}

2 、修飾靜態(tài)方法

只是把SynModel中的方法變成了靜態(tài)的,注意此時鎖住的是 SynModel這個類,不是鎖的實例。會排隊 先輸出1后輸出2

public class SynchronizedTest {

    public static void main(String[] args) throws InterruptedException {
        SynModel synModel1 = new SynModel();
        SynModel synModel2 = new SynModel();
        new Thread(()->{
            synModel1.fun1();
        },"A").start();

        TimeUnit.SECONDS.sleep(1);
        new Thread(()->{
            synModel2.fun2();
        },"B").start();
    }
}
class SynModel{

    public static synchronized void fun1()  {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("1...");
    }
    public static synchronized void fun2(){
        System.out.println("2...");
    }
}

3、代碼塊

synchronized (this){}鎖住的是SynModel這個對象??梢钥吹窖h(huán)的五次都是同一個SynModel對象。所以五個線程 某個時刻只能有一個線程拿到這個SynModel對象 這個資源。
每個線程會依次輸出start end


public class SynchronizedTest {
    public static void main(String[] args) {
        final SynModel synModel = new SynModel();
        for (int i = 0; i < 5; i++) {
            synModel.fun3();
        }
    }
}
class SynModel{
    public void fun3(){
        synchronized (this){
            System.out.println("start");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("end");
        }
    }

}

如果把對象放在循環(huán)里面,此時就是五個線程拿五個資源了。并沒有去爭奪資源

public class SynchronizedTest {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            final SynModel synModel = new SynModel();
            new Thread(()->{
                synModel.fun3();
            }).start();
        }
    }
}
class SynModel{
    public void fun3(){
        synchronized (this){
            System.out.println("ThreadName:"+Thread.currentThread().getName()+"start");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ThreadName:"+Thread.currentThread().getName()+"end");
        }
    }

}

鎖住SynModel.class 此時五個線程就會競爭,因為鎖住的是 SynModel這個類,而不是實例對象了。文章來源地址http://www.zghlxwxcb.cn/news/detail-745788.html

public class SynchronizedTest {

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            final SynModel synModel = new SynModel();
            new Thread(()->{
                synModel.fun3();
            }).start();
        }
    }
}
class SynModel{

  

    public void fun3(){
        synchronized (SynModel.class){// this SynModel.class
            System.out.println("ThreadName:"+Thread.currentThread().getName()+"start");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ThreadName:"+Thread.currentThread().getName()+"end");
        }
    }

}

到了這里,關(guān)于synchronized 到底鎖的是誰?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包