一、悲观锁和乐观锁
1.1. 一级目录1
1.1.1. 二级目录1
1.1.2. 二级目录1
1.2 八锁案例
1.2.1 说明
- 标准访问有ab两个线程,请问是先打印邮件还是短信?
- sendEmal方法中加入暂停3秒钟,请问先打印邮件还是短份?
- 添加一个普通的heLLo方法,请问先打印邮件还是helLo?
- 有两部手机,请问先打印邮件还是短信
- 有两个静态同步方法,有部手机,请问先打印邮件还是短信?
- 有两个静态同步方法,有2部手机,请问先打印邮件还是短信?
- 有1个静态同步方法,有1个普通同步方法,有部手机,请问先打印邮件还是短信?
- 一个静态同步方法,有1个普通同步方法,有2部手机,请问先打印邮件还是短信?
1.2.2 分析总结
- 根据情况1和情况2得出结论:不管暂停3秒还是不暂停都是先打印邮件再打印短信。
一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized的方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访网这些synchronized方法。锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法
public class Lock8Demo {
public static void main(String[] args)//一切程序的入口
{
Phone phone = new Phone();
new Thread(() -> {
phone.sendEmail();
}, "a").start();
//暂停200毫秒,保证a线程先启动
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
phone.sendSMS();
}, "b").start();
}
}
class Phone //资源类
{
public synchronized void sendEmail() {
// 第二种情况:暂停3秒
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 打印邮件
System.out.println("-----sendEmai1");
}
public synchronized void sendSMS() {
// 打印短信
System.out.println("-----sendsms");
}
}
1.3 一级目录3
1.3.1 二级目录5
内容5