目录
8种情况演示锁的案例
深入探究锁的奥秘
第一种情况:标准访问
描述:有两个线程a和b,分别调用
sendEmail
和sendSMS
方法,请问输出顺序如何?结果:邮件 短信
class Phone {
public synchronized void sendEmail() {
System.out.println("----sendEmail");
}
public synchronized void sendSMS() {
System.out.println("----sendSMS");
}
}
public class LockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.sendEmail();
}, "a").start();
// 短暂暂停以确保a线程启动
try {
TimeUnit.MICROSECONDS.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
new Thread(() -> {
phone.sendSMS();
}, "b").start();
}
}
第二种情况:加入延迟
描述:在
sendEmail
方法中加入3秒延迟,请问输出顺序如何?结果:邮件 短信
class Phone {
public synchronized void sendEmail() {
try {
// 延时3s
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("----sendEmail");
}
public synchronized void sendSMS() {
System.out.println("----sendSMS");
}
}
public class LockDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.sendEmail();
}, "a").start();
// 短暂暂停以确保a线程启动
try {
TimeUnit.MICROSECONDS.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
new Thread(() -> {
phone.sendSMS();
}, "b").start();
}
}
第三种情况:添加非同步方法
描述:在
Phone
类中添加一个非同步的hello
方法,并同时调用sendEmail
和hello
方法,请问输出顺序如何?结果:hello 邮件