/**
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括号里配置的对象。