8鎖現(xiàn)象

8鎖,關于鎖的8個問題

1、標準情況下,兩個線程先打印 發(fā)短信 還是 打電話?發(fā)短信

2、sendMsm延遲4秒,兩個線程先打印 發(fā)短信 還是 打電話?發(fā)短信


public class Test1 {
    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(() -> {
            phone.sendMsg();
        }, "A").start();

        try{
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone.call();
        }, "B").start();
    }
}

class Phone {

    //synchronized 鎖的對象時方法的調(diào)用者!
    //兩個方法是同一個鎖,誰先拿到誰執(zhí)行

    public synchronized void sendMsg(){
        try{
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("發(fā)短信");
    }

    public synchronized void call() {
        System.out.println("打電話");
    }
}

3、增加一個普通方法,先打印 發(fā)短信 還是 hello? hello
4、兩個對象,兩個同步方法,先打印 發(fā)短信 還是 打電話? 打電話

public class Test2 {
    public static void main(String[] args) {
        Phone2 phone1 = new Phone2();
        Phone2 phone2 = new Phone2();

        new Thread(() -> {
            phone1.sendMsg();
        }, "A").start();

        try{
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone1.hello();
        }, "B").start();

        new Thread(() -> {
            phone2.call();
        }, "B").start();
    }
}

class Phone2 {

    //synchronized 鎖的對象時方法的調(diào)用者!
    public synchronized void sendMsg(){
        try{
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("發(fā)短信");
    }

    public synchronized void call() {
        System.out.println("打電話");
    }

    //這里沒有鎖!不是同步方法,不受所得影響
    public void hello() {
        System.out.println("hello hello");
    }
}

5、增加兩個靜態(tài)變量,只有一個對象,先打印 發(fā)短信 還是 打電話? 發(fā)短信
6、增加兩個靜態(tài)變量,兩個對象,先打印 發(fā)短信 還是 打電話? 發(fā)短信

public class Test3 {
    public static void main(String[] args) {
        //兩個對象的Class模板只有一個
        Phone3 phone1 = new Phone3();
        Phone3 phone2 = new Phone3();

        new Thread(() -> {
            phone1.sendMsg();
        }, "A").start();

        try{
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone1.call();
        }, "B").start();

        new Thread(() -> {
            phone2.call();
        }, "B").start();

    }
}

//Phone3只有唯一的一個Class對象
class Phone3 {

    //synchronized 鎖的對象時方法的調(diào)用者!
    //static 靜態(tài)方法,類一加載就有了,鎖的是Class
    public static synchronized void sendMsg(){
        try{
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("發(fā)短信");
    }

    public static synchronized void call() {
        System.out.println("打電話");
    }

}

7、一個普通同步方法,一個靜態(tài)同步方法,一個對象,先打印發(fā)短信還是打電話? 打電話
8、一個普通同步方法,一個靜態(tài)同步方法,兩個個對象,先打印發(fā)短信還是打電話? 打電話

public class Test4 {
    public static void main(String[] args) {
        Phone4 phone = new Phone4();
        Phone4 phone2 = new Phone4();

        new Thread(() -> {
            phone.sendMsg();
        }, "A").start();

        try{
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone2.call();
        }, "B").start();
    }
}

class Phone4 {

    //鎖的是Class類模板
    public static synchronized void sendMsg(){
        try{
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("發(fā)短信");
    }

    //鎖的是調(diào)用者
    public synchronized void call() {
        System.out.println("打電話");
    }
}

小結

new 對象,鎖具體的一個Phone

static Class 鎖唯一的類模板

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容