Juc06_Lock8锁问题、字节码层面看Synchronized、反编译synchronized锁

1、Lock8 8锁问题

  1. 标准访问有 a、b 两个线程,请问先打印邮件还是短信
  2. sendEmail 方法暂停 3 秒钟,请问先打印邮件还是短信
  3. 新增一个普通的 hello 方法,请问先打印邮件还是 hello
  4. 有两部手机,请问先打印邮件还是短信
  5. 两个静态同步方法,同 1 部手机,请问先打印邮件还是短信
  6. 两个静态同步方法,2 部手机,请问先打印邮件还是短信
  7. 1 个静态同步方法,1 个普通同步方法,同 1 部手机,请问先打印邮件还是短信
  8. 1 个静态同步方法,1 个普通同步方法,2 部手机,请问先打印邮件还是短信
class Phone{ //资源类
    public static synchronized void sendEmail() {
        //暂停几秒钟线程
        try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println("-------sendEmail");
    }

    public synchronized void sendSMS()
    {
        System.out.println("-------sendSMS");
    }

    public void hello()
    {
        System.out.println("-------hello");
    }
}
public class Lock8Demo{
    public static void main(String[] args){//一切程序的入口,主线程
        Phone phone = new Phone();//资源类1
        Phone phone2 = new Phone();//资源类2

        new Thread(() -> {
            phone.sendEmail();
        },"a").start();

        //暂停毫秒
        try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); }

        new Thread(() -> {
            //phone.sendSMS();
            //phone.hello();
            phone2.sendSMS();
        },"b").start();

    }
}
/**
 *
 * ============================================
 *  1-2
 *  *  一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,
 *  *  其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法
 *  *  锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法
 *
 *  3-4
 *  *  加个普通方法后发现和同步锁无关
 *  *  换成两个对象后,不是同一把锁了,情况立刻变化。
 *
 *  5-6 都换成静态同步方法后,情况又变化
 *  三种 synchronized 锁的内容有一些差别:
 * 对于普通同步方法,锁的是当前实例对象,通常指this,具体的一部部手机,所有的普通同步方法用的都是同一把锁——实例对象本身,
 * 对于静态同步方法,锁的是当前类的Class对象,如Phone.class唯一的一个模板
 * 对于同步方法块,锁的是 synchronized 括号内的对象
 *
 *  7-8
 *    当一个线程试图访问同步代码时它首先必须得到锁,退出或抛出异常时必须释放锁。
 *  *
 *  *  所有的普通同步方法用的都是同一把锁——实例对象本身,就是new出来的具体实例对象本身,本类this
 *  *  也就是说如果一个实例对象的普通同步方法获取锁后,该实例对象的其他普通同步方法必须等待获取锁的方法释放锁后才能获取锁。
 *  *
 *  *  所有的静态同步方法用的也是同一把锁——类对象本身,就是我们说过的唯一模板Class
 *  *  具体实例对象this和唯一模板Class,这两把锁是两个不同的对象,所以静态同步方法与普通同步方法之间是不会有竞态条件的
 *  *  但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁。
 **/

2、从字节码角度分析 synchronized 实现

  • 反编译:javap -v -p *.class > 类.txt 将进行输出到txt中
  • synchronized 有三种应用方式
  1. 作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁
  2. 作用于代码块,对括号里配置的对象加锁
  3. 作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁
  • synchronize 同步代码块
  1. 实现使用的是 monitorenter 和 monitorexit 指令
  2. 一定是一个 enter 和 两个 exit 吗? 

      (不一定,如果方法中直接抛出异常处理,那么就是一个 monitorenter 和 monitorexit)

  • synchronized 普通同步方法

  (调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程会将先持有 monitor 然后再执行方法,最后在方法完成(无论是正常完成还是非正常完成)时释放 monitor)

  • synchronized 静态同步方法 

   (ACC_STATIC、ACC_SYNCHRONIZED 访问标志区分该方法是否静态同步方法)

3、反编译 synchronized 锁的是什么 

任何一个对象都可以成为一个锁,在 HotSpot 虚拟机中,monitor 采用 ObjectMonitor 实现

上述 C++ 源码解读

1. ObjectMonitor.java -- ObjectMonitor.cpp -- ObjectMonitor.hpp

2. ObjectMonitor.hpp(底层源码解析)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/369300.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国大学生计算机设计大赛与大数据应用主题赛

中国大学生计算机设计大赛 与大数据应用主题赛 中国大学生计算机设计大赛(简称“大赛”或4C)始筹于2007年,首届于2008年,已经举办了16届80场赛事。是我国高校面向本科生最早的赛事之一,由教育部计算机类教指委发起举…

CTF-MISC图片求正确宽高破解和修改总结

CTF-MISC图片求正确宽高破解和修改总结 文章目录 CTF-MISC图片求正确宽高破解和修改总结图片宽高破解根据像素求宽高脚本求正确宽高 如何修改宽高010 Editor修改 图片宽高破解 根据像素求宽高 以青少年CTFmisc 简简单单的题目为例: 我鼠标右侧属性查看相册 右键属…

【项目日记(八)】第三层: 页缓存的具体实现(下)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你做项目   🔝🔝 开发环境: Visual Studio 2022 项目日…

国内外b2b网站大全,免费b2b网站平台有哪些?

B2B网站大全平台主要是提供各类B2B网站的免费收录和分类,涵盖了外贸、机械、建筑、化工、五金、电工、农林、仪器、食品、能源、服装、冶金、电子等,这些B2B网站可以帮助中小企业和中国制造业提供在线采购、供求信息,招标信息。 免费B2B网站分…

[Tomcat问题]--使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常

[Tomcat问题]–使用Tomcat 10.x部署项目时,出现实例化Servlet类[xxx]异常 本片博文在知乎同步更新 环境 OS: Windows 11 23H2Java Version: java 21.0.1 2023-10-17 LTSIDE: IntelliJ IDEA 2023.3.3Maven: Apache Maven 3.9.6Tomcat: Tomcat 10.1.18 ReleasedSer…

2024年【安全员-B证】考试资料及安全员-B证模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2024年安全员-B证考试资料为正在备考安全员-B证操作证的学员准备的理论考试专题,每个月更新的安全员-B证模拟考试题库祝您顺利通过安全员-B证考试。 1、【多选题】《中华人民共和国安全生产法》规定&#…

C语言:详解操作符(上)

摘要: 本篇,我们将学习C语言中操作符的相关内容,操作符是C语言中重要的元素之一,在我们的代码中处处都有,下面我们将详细介绍操作符的相关内容,并结合一些代码例题加深印象。 目录 一、操作符的分类及介绍 …

黑马头条D1 导学

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…

ChatGPT实战100例 - (15) 还不会写 Stable Diffusion (SD) 绘画提示词?没关系,ChatGPT帮你搞定

文章目录 ChatGPT实战100例 - (15) 还不会写 Stable Diffusion (SD) 绘画提示词?没关系,ChatGPT帮你搞定一、把场景描述转为镜头语言二、把镜头语言转换为Prompt三、把Prompt转换为图片 ChatGPT实战100例 - (15) 还不会写 Stable Diffusion (SD) 绘画提示…

指针详解(3)

各位少年,大家好,我是博主那一脸阳光,今天介绍 二级指针 指针数组,还有个指针数组模拟二维数组。 前言:在浩瀚的C语言编程宇宙中,指针犹如一把打开内存世界大门的独特钥匙,它不仅是理解程序运行…

牛客寒假算法基础集训营1 E本题主要考察了贪心

示例1 输入 3 4 3 2 4 5 8 1 2 1 4 2 4 3 1 3 1 1 2 3 6 6 1 2 3 4 5 6 2 3 2 3 3 4 4 5 5 6 6 1 输出 1 1 4 #include<bits/stdc.h> using namespace std; int u0,m,n; int num100,tempnum1;//tempnum表示当前这一组合鸡的排名&#xff0c;num是最终排名 pair<i…

JAVA学习之面向对象

JAVA学习之面向对象 PART ONE&#xff1a;面向对象基础 1.类与对象&#xff1a; 类是一种抽象的概念&#xff0c;它描述了一类具有相似属性和行为的对象的集合。类定义了对象的属性和行为&#xff0c;并且可以作为创建对象的模板。 对象是类的实例&#xff0c;它是类的具体…

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

主页&#xff1a;元存储 全文 7700 字&#xff0c;原创请勿转载。 DRAM: where memory meets potential." - Bill Gates 前言 有数据的地方就有存储&#xff0c; 内存是谁都离不开的产品。DRAM主要负责硬盘、主板、显卡等硬件与处理器之间的数据交换。 本博客将介绍D…

STM32--HAL库定时器学习记录(易懂)--持续学习

一、什么是定时器 定时器就是计数器&#xff0c;通过计数完成一系列功能。 二、定时器的分类 定时器分为基本定时器、通用定时器、高级定时器。级别不同&#xff0c;功能不同。级别越高&#xff0c;功能越强。 三、定时器&#xff08;计数器&#xff09;三个重要寄存器 预分…

快速上手AI代码生成:CodeGeeX

1. VSCode等IDE插件直接搜到 CodeGeeX 就可以安装&#xff0c;装上之后&#xff0c;会看到左侧出现了&#xff1a; 2. 登陆以后&#xff0c;在代码区域就可以直接用了。 3. 官网功能说明文档&#xff08;非常简洁清晰&#xff09;&#xff1a; https://zhipu-ai.feishu.cn/wik…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…

以太网帧格式及ARP协议简介

在以太网中&#xff0c;一个主机和另一个主机进行通信&#xff0c;必须要知道目的主机的MAC地址&#xff08;物理地址&#xff09;&#xff0c;只要知道目的主机的IP地址&#xff0c;就可以通过ARP协议获取目的主机的MAC地址。 1、ARP协议简介 ARP&#xff08;Address Resolut…

2024年【熔化焊接与热切割】考试题及熔化焊接与热切割操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题根据新熔化焊接与热切割考试大纲要求&#xff0c;安全生产模拟考试一点通将熔化焊接与热切割模拟考试试题进行汇编&#xff0c;组成一套熔化焊接与热切割全真模拟考试试题&#xff0c;学员可通…

京东广告算法架构体系建设--高性能计算方案最佳实践 | 京东零售广告技术团队

1、前言 推荐领域算法模型的在线推理是一个对高并发、高实时有较强要求的场景。算法最初是基于Wide & Deep相对简单的网络结构进行建模&#xff0c;容易满足高实时、高并发的推理性能要求。但随着广告模型效果优化进入深水区&#xff0c;基于Transformer用户行为序列和Att…

网络原理TCP/IP(3)

文章目录 滑动窗口流量控制拥塞控制延迟应答捎带应答 滑动窗口 确认应答策略,对每⼀个发送的数据段,都要给⼀个ACK确认应答.收到ACK后再发送下⼀个数据段.这样做有⼀个比较大的缺点,就是性能较差.尤其是数据往返的时间较长的时候. 为了解决低效率传输&#xff0c;引入了滑动窗…