栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程安全之synchronized

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程安全之synchronized

多线程操作临界资源,存在线程安全问题,解决方法都是===>序列化访问临界资源
synchronized历史:
jdk1.6之前,性能低,依赖java对象加锁,创建一个对象,jvm维护一个monitor缓存;保证互斥,缓存依赖底层操作系统OS中mutex互斥量(重量级锁),linux中是Pthread。jdk1.6开始,做了锁升级优化,无锁->偏向锁->轻量级锁->重量级锁(随着竞争激烈程度升级):
        没有代码执行时,无锁
        当来了一个线程访问时,升级为偏向锁
        当来了多个线程,但是竞争不是很激烈(执行很多,交替执行),升级为轻量级锁,未拿到锁的线程不会阻塞,而是在自旋,不会让出cpu使用权
        重量级锁 阻塞的线程被挂起,等待重新调度,导致用户态和内核态来回切换,对性能有较大影响

用户态与内核态:
操作系统中的程序,一般都是在用户态下运行的。当程序需要借助操作系统来完成一些自己无法完成的操作时,便会从用户态切换到内核态,如果频繁切换,这样的开销还是很大的。
重量级锁:
其实现原理是通过操作系统调用MutexLock来保证竞态资源的互斥,所以会产生用户态与内核态的切换。
synchronized的使用:根据锁的力度不同区分:
1.加在静态方法上,其实是类锁,因为是静态方法,它把整个类都锁起来了
2.加在非静态方法上,锁的是调用该方法的对象,即this
3.加在代码块中

synchronized是内置锁,隐藏锁,互斥锁。

synchronized加锁是加在对象上的,下面介绍一下对象的锁状态记录:

对象锁信息
对象头:三部分mark word, metadata, 数组元信息(数据对象才有)

openjdk提供jol-core可以打印对象头信息

JVM关闭偏向锁命令: -XX:-UseBiasedLocking //关闭偏向锁(默认打开)

synchronized优化:
锁的膨胀升级(不可逆)
锁的粗化
锁的消除
自旋锁

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/444891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号