首页投稿(暂停使用,暂停投稿)程序员

Java 并发编程(2): Java 中的同步原语

2016-07-08  本文已影响494人  沪上最强亚巴顿

1 volatile

volatile 实现了轻量级的线程间通信机制.

1.1 volatile 的特性

1.2 volatile 读/写的内存语义

1.3 volatile 内存语义的实现

3.1.4 volatile 汇编指令的实现

3.1.4 增强volatile 内存语义的原因

3.2 synchronized 锁

锁让临界区互斥执行, 同时可以让释放锁的线程向获取同一锁的线程发送消息.

3.2.1 锁的释放和获取的内存语义

3.2.2 锁的实现原理

3.2.3 JDK 1.6 中的锁

优点 缺点 使用场景
偏向锁 加解锁无消耗 若存在线程间的锁竞争,会带来额外的锁撤销消耗 只有一个线程访问同步块
轻量级锁 竞争的线程不会阻塞 得不到锁竞争的线程,会使用自旋来消耗CPU 追求响应速度, 同步块的执行速度快
重量级锁 线程竞争不会自旋 线程阻塞, 响应时间慢 追求吞吐量,同步块执行速度慢

3.3 final

3.3.1 final 与的内存语义

3.3.2 写final 域的重排序规则

3.3.3 读final 域的重排序规则

3.3.4 final 域为引用类型

3.3.5 final 引用的'溢出'

3.3.6 X86 CPU 中的final 实现

3.3.6 增强final 语义的原因

3.4 原子操作

在Java 中通过锁和循环CAS 的方式实现原子操作.

3.2.1 CPU 如何实现原子操作

3.2.2 CAS: compareAndSwap()

3.2.3 CAS 的三大问题

3.5 双重检查锁定与延迟初始化

3.5.1 双重检查锁的由来

    if ( instance == null){    // 第一次检查
        synchronized (DoubleCheckedLocing.clss){ // 加锁
            if( instance == null) // 第二次检查
                instance = new Instance(); // 对象的创建.
        }
        return instance;
    }

3.5.2 问题的根源

3.5.3 基于volatile 的解决方案

3.5.4 基于类初始化的解决方案

3.5.5 实践

上一篇 下一篇

猜你喜欢

热点阅读