JVM---高效并发与锁优化

高效并发:

高效并发前提是并发的正确性,如何保证并发的正确性和如何实现线程安全?
线程安全定义:
当多个线程访问一个对象时候,如果不用考虑这些线程在运行时候环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。

互斥同步。

操作数据5大特征:
不可变,绝对线程安全,相对线程安全,线程兼容和线程对立。
不可变 final
绝对线程安全 vector
相对线程安全:vector、hashtable、collections.synchronizedCollection()方法包装的集合等
线程兼容(线程不安全):arrayList hashmap
线程对立:执行,停止相反的命令

如何实现线程安全:
MutuafExclusion & Synchronization。
互斥是方法,同步是目的。
比如互斥还有其他实现方法:Critical Section,互斥量Mutex和信号量Semaphore。

synchronized关键字经过编译形成两个字节码指令:monitorenter和monitorexit这两个字节码指令。他们都需要一个reference类型的参数来指明要锁定和解锁的对象。如果指定了参数,那么就是这个对象参数的reference,如果没指定就是方法或者类方法,去掉对应的对象实例或Class对象来作为锁对象。

ReentranLock可重入锁来实现同步。
与synchronized区别就是高级功能有等待可中断,可实现公平锁,以及锁可绑定多个条件。
在这里插入图片描述

非阻塞同步

互斥同步最主要的问题是进行线程阻塞和唤醒所带来的性能问题,阻塞同步。

在这里插入图片描述
如果有ABA问题的话那么传统的互斥同步synchronized更加高效。ABA问题指,CAS–compareAndSet原理先比较后赋值,如果是中间改为B又改为C,则它不认为改变了。

可重入代码:任何时候中断都可以,如何判断是重入代码,就是结果每次与预测一样

线程本地存储:共享数据的代码放在同一个线程中执行。

锁优化

jdk1.5—》1.6的优化
适应型自旋,锁消除,锁粗化,轻量级锁,偏向锁等。

自旋锁与自适应自旋

-XX:+UseSpinning参数开启,1.6以后默认开启。自旋次数的默认值10次,可以通过-XX:PreBlockSpin来更改。
**适应与锁占用时间短**

锁消除
了解逃逸分析可以参考这里

逃逸分析的数据支持的判定来决定锁消除。

锁粗化

如果虚拟机探测到有零碎的操作都对同一个对象加锁,就会把加锁同步的范围扩展到整个操作序列的外部。

轻量级锁
在这里插入图片描述在这里插入图片描述轻量级锁使用CAS操作避免了使用互斥量的开销,但是如果存在锁竞争,除了互斥量的开销外,还额外发生了CAS操作,因此有竞争的情况下,轻量级锁会比传统的重量级锁更慢。
偏向锁
在这里插入图片描述

如果程序中大多数的锁总是被多个不同的线程访问,那偏向模式就是多余的通过-XX:-UseBiasedLocking来禁止偏向锁优化反而可能会提高性能。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小诚信驿站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值