五、synchronized细节
public class test { public static void main(String[] args) { Phone phone = new Phone(); new Thread(() -> { phone.sendEmail(); }).start(); new Thread(() -> { phone.sendSms(); }).start(); new Thread(() -> { phone.sendHello(); }).start(); } } class Phone { public synchronized void sendEmail() { System.out.println("sendEmail。。。"); try { System.out.println("暂停3秒钟"); TimeUnit.SECONDS.sleep(3); System.out.println("暂停完成"); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void sendSms() { System.out.println("sendSms。。。"); } public void sendHello() { System.out.println("sendHello。。。"); } }
输出
sendEmail。。。
暂停3秒钟
sendHello。。。
暂停完成
sendSms。。。
说明:
1、一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,其他的线程都只能等待。
2、synchronized锁的是当前对象this,被锁定后,其他线程都不能进入当前对象的其他的synchronized方法。
3、未加synchronized修饰的方法,不会有竞争关系,可以直接调用。
4、对于普通同步方法,synchronized锁的是当前实例对象,通常值this,所有的普通同步方法用的都是同一把锁——实例对象本身。
5、对于static静态同步方法,synchronized锁的是当前类的Class对象,如.class唯一的一个模板。
6、对于同步方法块,锁的是synchronized括号内的对象。