/**
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括號裏配置的對象。