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

Posted jdktomcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十三章 线程安全与锁优化相关的知识,希望对你有一定的参考价值。

  • 线程安全:当多个线程访问一个对象时,如果不同考虑这些线程在运行时环境下的调度和替换执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用
                         这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
  • 线程安全的实现方法:
    • 互斥同步: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)
  • 锁优化:
    • 自旋锁与自适应自旋:互斥同步的时候,对性能影响最大的是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。
                                               同时,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得。如果物理机器有一个以上的处理器,能让两个或者以上
                                               的线程同时并行执行,可以让后面请求的那个线程“稍等一下”,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,
                                               只需要让线程执行一个忙循环(自旋),这就是所谓的自旋锁。自适应自旋:自旋的时间不在固定,而是由前一次在同一个锁上的自旋时间及锁的持有者
                                               状态来决定。
    • 锁消除:
    • 锁粗化:
    • 轻量级锁:
    • 偏向锁:








以上是关于第十三章 线程安全与锁优化的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第十三章-多线程(线程安全问题的现象)

JAVA-初步认识-第十三章-同步的前提

线程安全与锁优化

JAVA-初步认识-第十三章-单例模式涉及的多线程问题

线程安全与锁优化

线程安全与锁优化