编程语言爱好者Java 核心技术JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

synchronized

2021-06-07  本文已影响0人  蓝梅

一、synchronized方式

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

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

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

二、原理

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

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

三、锁标识位

锁标识在对象头markWord

无锁状态的markword 有锁状态的MarkWord
上一篇下一篇

猜你喜欢

热点阅读