• JUC_8种锁情况


    一、多线程锁

    在这里插入图片描述

    1.锁的8个问题

    1 标准访问,先打印短信还是邮件
    24秒在短信方法内,先打印短信还是邮件
    3 普通的hello方法,是先打短信还是hello
    4 现在有两部手机,先打印短信还是邮件
    5 两个静态同步方法,1部手机,先打印短信还是邮件
    6 两个静态同步方法,2部手机,先打印短信还是邮件
    7 1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件
    8 1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    .锁的分析

    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

  • 相关阅读:
    rocketMQ是如何利用MQFaultStrategy规避延迟故障的?
    TensorFlow案例学习:图片风格迁移
    终于见到你了,中国天眼!
    YOLOv5-QAT量化部署
    商场会员营销系统 购物中心会员精细化运营体系
    (Research)泛癌单细胞分析揭示肿瘤微环境中癌相关成纤维细胞的异质性和可塑性
    Java集合
    反射课后习题及做题记录
    解析csv文件,读取百万级数据
    Apache SeaTunnel在VIP 中的使用
  • 原文地址:https://blog.csdn.net/qq_46548855/article/details/125957549