码迷,mamicode.com
首页 > 编程语言 > 详细

第十三章 线程安全与锁优化

时间:2019-01-09 20:20:11      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:tor   恢复   关键字   计数   sync   优化   monitor   阻塞   替换   

  • 线程安全:当多个线程访问一个对象时,如果不同考虑这些线程在运行时环境下的调度和替换执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用
                         这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
  • 线程安全的实现方法:
    • 互斥同步:synchronized关键字 monitorenter monitorexit字节码指令,在执行monitorenter指令时,首先要尝试获取对象的锁,如果该对象未被锁定或者当前线程已经拥有
                           了那个对象的锁,把锁的计数器加1,相应的,在执行monitorexit指令时会将锁计数器减1,当计数器为0时,锁就被释放。若果获取对象锁失败,那当前线程就要
                           阻塞等待,直到对象锁被另外一个线程释放为止。JUC包下ReentrantLock可重入锁,高级项:
                           1.等待可中断 2.可实现公平锁  3.绑定多个条件
    • 非阻塞同步(Non-Blocking Synchronization):CAS指令执行时,当且仅当V符合旧预期值A时,处理器甩新值B更新V的值,否则它就不执行更新。CAS V A B
    • 无同步方案:1.可重入代码 2.线程本地存储(Thread Local Storage)
  • 锁优化:
    • 自旋锁与自适应自旋:互斥同步的时候,对性能影响最大的是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。
                                               同时,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得。如果物理机器有一个以上的处理器,能让两个或者以上
                                               的线程同时并行执行,可以让后面请求的那个线程“稍等一下”,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,
                                               只需要让线程执行一个忙循环(自旋),这就是所谓的自旋锁。自适应自旋:自旋的时间不在固定,而是由前一次在同一个锁上的自旋时间及锁的持有者
                                               状态来决定。
    • 锁消除:
    • 锁粗化:
    • 轻量级锁:
    • 偏向锁:

第十三章 线程安全与锁优化

标签:tor   恢复   关键字   计数   sync   优化   monitor   阻塞   替换   

原文地址:https://www.cnblogs.com/jdktomcat/p/10246424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!