
1 标准访问,先打印短信还是邮件
2 停4秒在短信方法内,先打印短信还是邮件
3 普通的hello方法,是先打短信还是hello
4 现在有两部手机,先打印短信还是邮件
5 两个静态同步方法,1部手机,先打印短信还是邮件
6 两个静态同步方法,2部手机,先打印短信还是邮件
7 1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件
8 1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件
根据8种锁的需求改
class Phone{
//发送短信
public synchronized void sendSMS(){
System.out.println("发送短信");
}
//发送邮件
public synchronized void sendEmail(){
System.out.println("发送邮件");
}
//普通方法
public void getHello(){
System.out.println("hello");
}
}
public class Lock_8 {
public static void main(String[] args) {
//创建一个资源类
Phone phone = new Phone();
//创建线程
new Thread(()->{
phone.sendSMS();
},"AA").start();
new Thread(()->{
phone.sendEmail();
},"BB").start();
}
}
1 标准访问,先打印短信还是邮件
先短信:跟main方法中写代码的顺序有关系
2 停4秒在短信方法内,先打印短信还是邮件
先短信后邮件
1和2的结论两个同步方法:都使用的同一把锁
3 普通的hello方法,是先打短信(停4秒)还是hello
先打印hello,如果不睡眠就跟main方法写代码的顺序有关
4 现在有两部手机,先打印短信(停4秒)还是邮件
先邮件后短信 说明两个同步方法使用的不是同一把锁(结合案例2得出结论)
5 两个静态同步方法,1部手机,先打印短信(停4秒)还是邮件
先短信,后邮件
6 两个静态同步方法,2部手机,先打印短信(停4秒)还是邮件
先短信,后邮件 结合案例4:因为是非静态的同步方法
结论:这两个静态同步方法使用的是同一把锁!这个锁是谁呢 Phone.class
7 1个静态同步方法,1个普通同步方法,1部手机,先打印短信(停4秒)还是邮件
先邮件后短信
跟睡眠的时间有关,如果没有睡眠,按照执行的顺序
8 1个静态同步方法,1个普通同步方法,2部手机,先打印短信(停4秒)还是邮件
先邮件后短信
跟睡眠的时间有关,如果没有睡眠,按照执行的顺序
总结
a 如果只有普通同步方法的时候!
执行顺序:按照代码写的顺序去执行,当前锁对象是this!
b 如果普通方法和同步方法的时候!
正常情况下:按照代码顺序执行,如果同步方法中有睡眠,则先执行普通方法
c 当不是同一个对象调用普通的同步方法时!
本质:每次创建对象的时候,都会创建属于自己的锁!这个锁就是当前对象 this
d 静态同步方法当前锁对象:Class.class