您的位置:首页 > 编程语言 > Java开发

Java线程安全与锁优化

2017-04-13 23:04 274 查看

线程安全

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

实现方法:

互斥同步(阻塞同步):悲观性并发策略

通过互斥的手段(临界区、信号量、互斥量)使得在多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。

通俗讲就是通过线程阻塞和唤醒来保证同步

synchronized

非阻塞同步:乐观性并发策略

通俗讲,就是不管是否需要同步,先进行操作,如果没有其他线程争夺共享数据,则操作成功;如果有争夺,再采取措施补救。

无同步方案:

不涉及数据共享,自然不需要同步措施。

可重入代码(纯代码):可以在代码执行的任何时候中断它,去执行别的代码,之后再返回,都不会产生任何错误。

锁优化

自旋锁与自适应锁:

自旋锁:通俗说,就是指需要请求锁的线程发现持有锁的线程很快就会释放锁,就直接进行一个忙循环(自旋)等待,而不进行线程的挂起和恢复(转入内核态)来浪费时间。

自适应自旋锁:在自旋锁的基础上,添加了自适应。即对同一个锁对象,自旋等待刚刚成功获取锁,虚拟机就认为这次自旋也很可能再次成功,进而允许自旋等待相对更长的时间;而如果一个锁,自旋很少成功过,则将可能直接忽略自旋过程。

锁消除:对一些代码上要求同步,但检测到不可能存在共享数据竞争的锁进行消除。

锁粗化:通俗说,是指在一个大范围内,会发生多次加锁再解锁的操作,则直接将加锁范围扩展(粗化)到最外面。

轻量级锁:

在无竞争的情况下,使用CAS操作消除同步使用的互斥量。

传统的锁机制叫“重量级”锁。

偏向锁:偏向于第一个获得它的线程

在无竞争的情况下,把整个同步都消除掉,连CAS操作都不做了。

不适用于锁总是被多个不同的线程访问的情形。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: