首页 > 程序开发 > 综合编程 > 其他综合 >

Java线程安全与锁优化

2017-04-14

Java线程安全与锁优化:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步。

Java线程安全与锁优化:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,则是线程安全的。 实现方法:

互斥同步(阻塞同步):悲观性并发策略
通过互斥的手段(临界区、信号量、互斥量)使得在多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。 通俗讲就是通过线程阻塞和唤醒来保证同步,非阻塞同步:乐观性并发策略
通俗讲,就是不管是否需要同步,先进行操作,如果没有其他线程争夺共享数据,则操作成功;如果有争夺,再采取措施补救。 无同步方案:
不涉及数据共享,自然不需要同步措施。 可重入代码(纯代码):可以在代码执行的任何时候中断它,去执行别的代码,之后再返回,都不会产生任何错误。

锁优化

自旋锁与自适应锁:
自旋锁:通俗说,就是指需要请求锁的线程发现持有锁的线程很快就会释放锁,就直接进行一个忙循环(自旋)等待,而不进行线程的挂起和恢复(转入内核态)来浪费时间。 自适应自旋锁:在自旋锁的基础上,添加了自适应。即对同一个锁对象,自旋等待刚刚成功获取锁,虚拟机就认为这次自旋也很可能再次成功,进而允许自旋等待相对更长的时间;而如果一个锁,自旋很少成功过,则将可能直接忽略自旋过程。 锁消除:对一些代码上要求同步,但检测到不可能存在共享数据竞争的锁进行消除。 锁粗化:通俗说,是指在一个大范围内,会发生多次加锁再解锁的操作,则直接将加锁范围扩展(粗化)到最外面。 轻量级锁:
在无竞争的情况下,使用CAS操作消除同步使用的互斥量。 传统的锁机制叫“重量级”锁。 偏向锁:偏向于第一个获得它的线程
在无竞争的情况下,把整个同步都消除掉,连CAS操作都不做了。 不适用于锁总是被多个不同的线程访问的情形。

相关文章
最新文章
热点推荐