知识大全 JAVA高级:多核线程-volatile原理与技巧[2]

Posted

篇首语:没有拆不散的夫妻,只有不努力的小三。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA高级:多核线程-volatile原理与技巧[2]相关的知识,希望对你有一定的参考价值。

JAVA高级:多核线程-volatile原理与技巧[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    原因

    这里的increase方法 执行的操作是i++ 即 i = i + ;

    针对i = i + 在多线程中的运算 本身需要改变i的值

    如果 在i已从内存中取到最新值 但未与 进行运算 此时其他线程已数次将运算结果赋值给i

    则当前线程结束时 之前的数次运算结果都将被覆蓋

    即 执行 次increase 可能结果是 <

    一般来说 这种情况需要较高的压力与并发情况下 才会出现

    如何避免这种情况?

    解决以上问题的方法

    一种是操作时 加上同步

    这种方法 无疑将大大降低程序性能 且违背了volatile的初衷

    第二种方式是 使用硬件原语(CAS) 实现非阻塞算法

    从CPU原语上 支持变量级别的低开销同步

    CPU原语 比较并交换(CompareAndSet) 实现非阻塞算法

    什么是CAS?

    cas是现代CPU提供给并发程序使用的原语操作 不同的CPU有不同的使用规范

    在 Intel 处理器中 比较并交换通过指令的 cmpxchg 系列实现

    PowerPC 处理器有一对名为 加载并保留 和 条件存储 的指令 它们实现相同的目地

    MIPS 与 PowerPC 处理器相似 除了第一个指令称为 加载链接

    CAS 操作包含三个操作数 内存位置(V) 预期原值(A)和新值(B)

    什么是非阻塞算法?

    一个线程的失败或挂起不应该影响其他线程的失败或挂起 这类算法称之为非阻塞(nonblocking)算法

    对比阻塞算法

    如果有一类并发操作 其中一个线程优先得到对象监视器的锁 当其他线程到达同步边界时 就会被阻塞

    直到前一个线程释放掉锁后 才可以继续竞争对象锁 (当然 这里的竞争也可是公平的 按先来后到的次序)

cha138/Article/program/Java/gj/201311/27718

相关参考