• 锁详解


    synchronized

    具体用法 https://www.cnblogs.com/lukelook/p/9946065.html

    • synchronized 关键字加到 static 静态方法和 synchronized(class) 代码块上都是是给 Class 类上锁。
    • synchronized 关键字加到实例方法上是给对象实例上锁。
    • 尽量不要使用 synchronized(String a) 因为 JVM 中,字符串常量池具有缓存功能!

    构造方法可以使用 synchronized 关键字修饰么?

    先说结论:构造方法不能使用 synchronized 关键字修饰。

    构造方法本身就属于线程安全的,不存在同步的构造方法一说。

    synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置,在执行monitorenter时,会尝试获取对象的锁,如果锁的计数器为 0 则表示锁可以被获取,获取后将锁计数器设为 1 也就是加 1。

    在执行 monitorexit 指令后,将锁计数器设为 0,表明锁被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到锁被另外一个线程释放为止。

    当执行 monitorenter 指令时,线程试图获取锁也就是获取 对象监视器 monitor 的持有权。

    synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。

    不过两者的本质都是对对象监视器 monitor 的获取。

    在 Java 虚拟机(HotSpot)中,Monitor 是基于 C++实现的,由ObjectMonitor实现的。每个对象中都内置了一个 ObjectMonitor对象。 所以才能锁住把对象锁住。

    对象的的这个锁是放在哪呢?

    看下这个

    https://www.cnblogs.com/wuqinglong/p/9945618.html 

    https://www.jianshu.com/p/b422fc9cbba0?utm_source=desktop&utm_medium=timeline

    锁主要存在四种状态,1 依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。

    另外,**wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。**

  • 相关阅读:
    纯css制作带三角(兼容所有浏览器)
    xmapp 404设置
    css 选择器
    IE6/IE7/IE8下float:right的异常及其解决方法
    artdialog5 bug
    jQuery插件开发--(转)
    Global对象
    JS 关于(function( window, undefined ) {})(window)写法的理解
    wx-charts 微信小程序图表插件
    小程序二次贝塞尔曲线,购物车商品曲线飞入效果
  • 原文地址:https://www.cnblogs.com/ningkuan/p/14419851.html
Copyright © 2020-2023  润新知