synchronized

作者: 蓝梅 | 来源:发表于2021-06-07 08:46 被阅读0次

    一、synchronized方式

    1、添加在静态方法上:则是对该class对象加锁,所以尽量不要在同一个类中添加多个synchronized方法,避免产生锁竞争导致的性能问题

    2、添加在非静态方法上:则是对当前对象(this)加锁

    3、同步代码块:括号中的对象加锁

    二、原理

    在JDK1.6之前,是直接加重量级锁,来实现互斥;任何一个对象都有一个monitor与之关联,当线程执行同步代码是,先去获取monitor,如果获取到monitor,则会执行当前代码,如果没有获取到,则会被挂起,挂起会放入monitor对象的对待队列中,等待被唤醒;(可以看下jvm源码的ObjectMonitor),monitor只能同时被一个线程获取;

    因为直接加重量级锁,性能比较差,所以在JDK1.6之后,加了一个锁膨胀升级的机制;当对象被创建时,是无锁状态,当第一个线程获取锁时,锁升级为偏向锁,当第二个线程来竞争时,则变成轻量级锁(轻量级锁使用在线程交替执行同步代码块);如果并发场景时轻量级锁获取失败,则还会进行自旋锁进行优化,毕竟直接升级为重量级锁,线程需要从用户态切换为内核态系统层面来挂起线程,会先进行自旋,当竞争激烈时(自旋时间过长,一般也不会太长),则升级为重量级锁;

    三、锁标识位

    锁标识在对象头markWord

    无锁状态的markword 有锁状态的MarkWord

    相关文章

      网友评论

        本文标题:synchronized

        本文链接:https://www.haomeiwen.com/subject/jovceltx.html