synchronized

一、synchronized方式

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

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

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

二、原理

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

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

三、锁标识位

锁标识在对象头markWord

无锁状态的markword
有锁状态的MarkWord
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容