zoukankan      html  css  js  c++  java
  • 锁详解

    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的异常的原因。**

  • 相关阅读:
    scanf与scanf_s的区别
    C语言输出时的各种%
    Windows下配置OpenGL环境
    C#高级进阶--重写函数
    Linux下安装国际版QQ (转)
    Linux Vim不明原因卡死解决办法
    iCamera App Kit 使用说明
    usb2.0高速视频采集之68013A寄存器配置说明
    iSensor APP 之 摄像头调试 OV5642 续集2
    iSensor APP 之 摄像头调试 OV9655 测试之二
  • 原文地址:https://www.cnblogs.com/ningkuan/p/14419851.html
Copyright © 2011-2022 走看看