13.2 线程安全的实现方法

1. 互斥同步。保证在某一时刻共享数据只被一个线程使用。

    synchronize为什么消耗大呢?synchronize在方法完成之前,会阻塞后面的进程,Java的线程映射到系统的原生进程之上的,如果要阻塞或唤醒一个线程,需要操作系统来帮忙完成,这就需要从用户态切换到内核态(通知系统操作之前,自旋等待一段时间,可以避免频繁状态切换)。

    lock的区别:

        1. synchronize是非公平的,lock默认是非公平的。

        2. lock是等待可中断,即持有锁的线程长期不释放锁的时候,等待的线程可以选择放弃等待。

        3. lock 可以绑定多个condition。

2. 非阻塞同步。乐观锁(乐观并发策略)需要“硬件指令集的发展”才能进行。我们需要操作跟冲突检测两个步骤具备原子性,保证原子性需要靠硬件来完成(硬件的处理器指令即可),这类指令常见的有:

    1. 测试并设置。Test and Set

    2. 获取并增加。Fetch and Increment

    3. 交换。Swap

    4. 比较并交换。CAS Compare And Swap 常用与JUC包中

    5. 加载连接/条件存储。Load-Linked/Store-Conditional

3. 无同步方案。    

    可重入代码:可以在代码执行的任意时候中断,控制权返回后也不会有影响。

    线程本地存储:线程私有。

你可能感兴趣的:(13.2 线程安全的实现方法)