Java 锁机制与线程调优

1. 为什么使用锁?

  多线程操作带来的问题?

    • 访问冲突;
    • 锁竞争;
      • 死锁;
      • 锁的粒度;
    • 上下文切换开销;
    • 同步/内存拷贝开销等;

2. 线程安全

  • Java内存模型(JMM)
    • working memory & main memory
  • 原子性;
  • 可见性;
  • 有序性;
    • happens before原则
  • 代码重排;
  • 内存屏障;
  • volatile;
  • 锁;

3. Java内存模型

4. 原子性 

  • byte/short/int/char/boolean/float  读写原子性;
  • long/double(64位)读写分两次32位操作,非原子性; 
  • int i++等组合操作,非原子性;
  • synchronized同步块内的操作,具有原子性;

5. 可见性

  • final
    • 被final修饰的字段初始化完成可确保可见性;
  • volatile
    • 读写volatile字段确保可见性;
  • synchronized
    • 同步块内读写字段确保可见性;
  • happens-before
    • 符合happens-before次序的可见性;

      

6. 有序性

原文地址:https://www.cnblogs.com/naray/p/13072982.html