知识大全 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相关参考
知识大全 JAVA高级:多核线程-volatile原理与技巧[4]
JAVA高级:多核线程-volatile原理与技巧[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 JAVA高级:多核线程-volatile原理与技巧[3]
JAVA高级:多核线程-volatile原理与技巧[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
为什么使用volatile比同步代价更低? 同步的代价主要由其覆蓋范围决定如果可以降低同步的覆蓋范围则可以大幅提升程序性能 而volatile的覆蓋范围仅仅变量级别的因此它的同步代价很低 v
知识大全 Java 理论与实践: 正确使用 volatile 变量 线程同步
Java理论与实践:正确使用volatile变量线程同步 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
Java语言规范中指出为了获得最佳速度允许线程保存共享成员变量的私有拷贝而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比 Volatile修饰的成员变量在每次被线程访问时都强迫从
Java多线程之volatile深入分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! vola
以前一直没在意一直以为volatile修饰了就高枕无忧了但其实不然最简单的一个场景 publicclassCounter publicvolatilestaticintcount=; pub
Java线程的概念与原理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一操作系统中线程和进程的
线程的创建和启动 java语言已经内置了多线程支持所有实现Runnable接口的类都可被启动一个新线程新线程会执行该实例的run()方法当run()方法执行完毕后线程就结束了一旦一个线程执行
实战Java多线程编程精要之高级支持 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 线程组 线