当前位置:首页 > 科技  > 软件

Synchronized关键字的底层原理?

来源: 责编: 时间:2024-03-18 09:39:23 89观看
导读1. synchronized的基本使用在现实场景中,抢票代码,如果不加锁,就会出现超卖或者一张票卖给多个人Synchronized对象锁采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其它线程再想获取这个对象锁时就会阻塞住,代码

1. synchronized的基本使用

在现实场景中,抢票代码,如果不加锁,就会出现超卖或者一张票卖给多个人aUB28资讯网——每日最新资讯28at.com

Synchronized对象锁采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其它线程再想获取这个对象锁时就会阻塞住,代码如下aUB28资讯网——每日最新资讯28at.com

public class synchronizedTest {    // 创建一个静态对象作为锁    static Object lock = new Object();    // 初始票数    int ticketNum = 20;    // 获取票的方法,使用 synchronized 修饰确保线程安全    public synchronized void getTicket() {        // 使用当前对象作为锁        synchronized (this) {            // 如果票数已经为零,则返回            if (ticketNum <= 0) {                return;            }            System.out.println(Thread.currentThread().getName() + "抢到一张票,剩余:" + ticketNum);            // 非原子性操作,扣除一张票            ticketNum--;        }    }    public static void main(String[] args) {        // 创建 synchronizedTest 实例        synchronizedTest synchronizedTest = new synchronizedTest();        // 创建并启动 20 个线程        for (int i = 0; i < 20; i++) {            // 调用获取票的方法            new Thread(() -> synchronizedTest.getTicket()).start();        }    }}

通过以上代码,加synchronized锁,就可以防止超卖aUB28资讯网——每日最新资讯28at.com

特别说明:synchronized 关键字的底层实现涉及到 Java 虚拟机中的监视器(Monitor)机制。每个 Java 对象都与一个 Monitor 相关联,Monitor 负责对象的锁定和解锁,以及线程的阻塞和唤醒。aUB28资讯网——每日最新资讯28at.com

2. Monitor

Monitor 被翻译为监视器,是由jvm提供,c++语言实现aUB28资讯网——每日最新资讯28at.com

使用一下简单代码中查看monitor,通过javap命令查看clsss的字节码aUB28资讯网——每日最新资讯28at.com

public class MonitorTest {    static final Object lock = new Object();    static int counter = 0;    public static void main(String[] args) {        synchronized (lock) {            counter++;        }    }}

图片图片aUB28资讯网——每日最新资讯28at.com

  • monitorenter: 上锁开始的地方
  • monitorexit:  解锁的地方
  • 其中被monitorenter和monitorexit包围住的指令就是上锁的代码

思考:为什么会出现两个monitorexitaUB28资讯网——每日最新资讯28at.com

有两个monitorexit的原因,第二个monitorexit是为了防止锁住的代码抛异常后不能及时释放锁在使用了synchornized代码块时需要指定一个对象,所以synchornized也被称为对象锁aUB28资讯网——每日最新资讯28at.com

monitor主要就是跟这个对象产生关联,如下图aUB28资讯网——每日最新资讯28at.com

图片图片aUB28资讯网——每日最新资讯28at.com

Monitor内部具体的存储结构:aUB28资讯网——每日最新资讯28at.com

  • Owner:存储当前获取锁的线程的,只能有一个线程可以获取
  • EntryList:关联没有抢到锁的线程,处于Blocked状态的线程
  • WaitSet:关联调用了wait方法的线程,处于Waiting状态的线程

具体的流程:aUB28资讯网——每日最新资讯28at.com

  • 代码进入synchorized代码块,先让lock(对象锁)关联的monitor,然后判断Owner是否有线程持有
  • 如果没有线程持有,则让当前线程持有,表示该线程获取锁成功
  • 如果有线程持有,则让当前线程进入entryList进行阻塞,如果Owner持有的线程已经释放了锁,在EntryList中的线程去竞争锁的持有权(非公平)
  • 如果代码块中调用了wait()方法,则会进去WaitSet中进行等待

3.面试题

面试官:synchronized关键字的底层原理?aUB28资讯网——每日最新资讯28at.com

  • Synchronized【对象锁】
  • 采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】
  • 它的底层由monitor实现的,monitor是jvm级别的对象( C++实现),线程获得锁需要使用对象(锁)关联monitor
  • 在monitor内部有三个属性,分别是owner、entrylist、waitset
  • 其中owner是关联的获得锁的线程,并且只能关联一个线程;entrylist关联的是处于阻塞状态的线程;waitset关联的是处于Waiting状态的线程

本文链接:http://www.28at.com/showinfo-26-76499-0.htmlSynchronized关键字的底层原理?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 记一次 .NET某设备监控自动化系统 CPU爆高分析

下一篇: 深入理解Java浅拷贝与深拷贝

标签:
  • 热门焦点
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top