多線程synchronized 8種鎖的狀態

/**

1.標準訪問,先打印短信還是郵件?
------sendSMS
------sendEmail

2.停4秒在短信方法內,先打印短信還是郵件?
------sendSMS
------sendEmail


3.新增普通的hello方法,是先打印短信還是hello?
----getHello
------sendSMS

4.現在有兩部手機,先打印短信還是郵件?
------sendEmail
------sendSMS

5.兩個靜態同步方法,1部手機,先打印短信還是郵件?
------sendSMS
------sendEmail

6.兩個靜態同步方法,2部手機,先打印短信還是郵件?
------sendSMS
------sendEmail

7.1個靜態同步方法,1個普通同步方法,1部手機,先打印短信還是郵件?
------sendEmail
------sendSMS

8.1個靜態同步方法,1個普通同步方法,2部手機,先打印短信還是郵件?
------sendEmail
------sendSMS

*/

代碼如下:
class Phone {
    public static synchronized void sendSMS() throws Exception {
        //停留4秒
        TimeUnit.SECONDS.sleep(4);
        System.out.println("------sendSMS");
    }

    public  synchronized void sendEmail() throws Exception {
        System.out.println("------sendEmail");
    }

    public void getHello() {
        System.out.println("----getHello");
    }
}


public class Lock_8 {

    public static void main(String[] args) throws InterruptedException {
        Phone phone1 = new Phone();
        Phone phone2 = new Phone();

        new Thread(() -> {
            try {
                phone1.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"AA").start();

        Thread.sleep(1);

        new Thread(() -> {
            try {
               //phone1.sendEmail();
              //  phone1.getHello();
                phone2.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"BB").start();
    }
}

 

總結:

synchronized實現同步的基礎: Java中的每一個對象都可以作爲鎖,具體表現爲以下3種形式:

1. 對於普通同步方法,鎖是當前實例對象。
2. 對於靜態同步方法,鎖是當前類的Class對象。
3. 對於同步方法塊,鎖是Synchronized括號裏配置的對象。

 

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