5 多线程锁
5.1 锁的八个问题演示
import java.util.concurrent.TimeUnit;
/**
* @Description: 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");
}
}
结论:
synchronized 实现同步的基础:Java 中的每一个对象都可以作为锁。
具体表现为以下 3 种形式。
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的 Class 对象。
对于同步方法块,锁是 Synchonized 括号里配置的对象