Java线程安全与锁优化

来源:互联网 发布:淘宝9.9包邮网站 编辑:程序博客网 时间:2024/06/03 12:01

线程安全

  • 定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,则是线程安全的。
  • 实现方法:
    • 互斥同步(阻塞同步):悲观性并发策略
      • 通过互斥的手段(临界区、信号量、互斥量)使得在多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。
      • 通俗讲就是通过线程阻塞和唤醒来保证同步
      • synchronized
    • 非阻塞同步:乐观性并发策略
      • 通俗讲,就是不管是否需要同步,先进行操作,如果没有其他线程争夺共享数据,则操作成功;如果有争夺,再采取措施补救。
    • 无同步方案:
      • 不涉及数据共享,自然不需要同步措施。
      • 可重入代码(纯代码):可以在代码执行的任何时候中断它,去执行别的代码,之后再返回,都不会产生任何错误。

锁优化

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