JUC--volatiley&CAS
public class VolatileTest {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
if(td.getFlag()){
System.out.println("========");
break;
}
}
}
}
class ThreadDemo implements Runnable{
private boolean flag=false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag=true;
System.out.println("flag="+getFlag());
}
public boolean getFlag(){
return flag;
}
}
flag是main thread和td共享的数据,他们都在各自的线程内有一个copy,由于while true的速度十分快,main thread不能读取到td修改后的值,所以只能输出 flag=true。
内存不可见性:当多个thread操作共享数据时,彼此不可见
volatile:当多个thread操作共享数据时,保证数据是可见的,内存栅栏 可以理解为多个线程直接操作主存中的数据
因为使用vloatile 不能指令重排 所以效率低

volatile相比synchronized:
是一种较为轻量级的同步策略,volatile不具备互斥性,两个线程可以同时访问共享数据,volatile不能保证变量的原子性,
原子性问题:i++

以下情况使用volatile不能解决非原子性问题:内存可见性问题依然存在
public class AtomicTest {
public static void main(String[] args) {
AtomicDemo ad = new AtomicDemo();
for(int i=0;i<10;i++){
new Thread(ad).start();
}
}
}
class AtomicDemo implements Runnable{
private int serialNum=0;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+getSerialNum());
}
public int getSerialNum(){
return serialNum++;
}
}
二、使用源自变量 java.util.concurrent.atomic 原子变量包
1.使用volatile保证内存可见性
2.使用CAS compare and swap算法保证数据的原子性
CAS是硬件对于并发操作共享数据的支持
CAS包含三个操作数:
内存值V 预估值A 更新值B
(1)首先读取内存之V 在替换的时候读取旧值A
AtomicInteger:保证线程安全 内存可见性 原子性问题
private AtomicInteger serialNum=new AtomicInteger();
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+getSerialNum());
}
public int getSerialNum(){
return serialNum.getAndIncrement();
}
CAS算法的模拟:
public class TestCAS {
public static void main(String[] args) {
final CompareAndSwap cas = new CompareAndSwap();
for(int i=0;i<10;i++){
new Thread(new Runnable() {
@Override
public void run() {
int expectVal = cas.get();
boolean b= cas.compareAndSwap(expectVal,(int)(Math.random()*101));
}
}).start();
}
}
}
class CompareAndSwap {
private int value;
public synchronized int get() {
return value;
}
public synchronized int cas(int expectVal, int newVal) {
int oldVal = value;
if (oldVal == expectVal)
this.value = newVal;
return oldVal;
}
public synchronized boolean compareAndSwap(int expectVal, int newVal) {
return expectVal==cas(expectVal,newVal);
}
}
JUC--volatiley&CAS的更多相关文章
- 一段JAVA代码了解多线程,JUC、CAS原子性操作。
@Test public void testPaceController_multiThread() throws InterruptedException { final PaceControlle ...
- JUC之CAS
CAS(全称为CompareAndSwap,也有说是CompareAndSet,都差不多)是一条CPU并发原语,它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,判断预期值和更改新值的 ...
- JUC
1.Java JUC简介 在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异 ...
- juc-2.1-模拟CAS算法
package com.wf.zhang.juc; /* * 模拟 CAS 算法 */ public class TestCompareAndSwap { public static void mai ...
- volatile关键字与内存可见性&原子变量与CAS算法
1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量 ...
- Spring Cloud--尚硅谷2020最新版
Spring Cloud 初识Spring Cloud与微服务 在传统的软件架构中,我们通常采用的是单体应用来构建一个系统,一个单体应用糅合了各种业务模块.起初在业务规模不是很大的情况下,对于单体应用 ...
- java多线程系列 JUC原子类 CAS及原子类
根据数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicInteg ...
- 【Java_多线程并发编程】JUC原子类——原子类中的volatile变量和CAS函数
JUC中的原子类是依靠volatile变量和Unsafe类中的CAS函数实现的. 1. volatile变量的特性 内存可见性(当一个线程修改volatile变量的值后,另一个线程就可以实时看到此变量 ...
- java并发编程(十三)----(JUC原子类)引用类型介绍(CAS和ABA的介绍)
这一节我们将探讨引用类型原子类:AtomicReference, AtomicStampedRerence, AtomicMarkableReference.AtomicReference的使用非常简 ...
- JUC原子操作类与乐观锁CAS
JUC原子操作类与乐观锁CAS 硬件中存在并发操作的原语,从而在硬件层面提升效率.在intel的CPU中,使用cmpxchg指令.在Java发展初期,java语言是不能够利用硬件提供的这些便利来提 ...
随机推荐
- 我的CSS
外框 固定宽高 内容居中 height: 200px ; width:200px; margin: 50rpx auto 0 auto; //上下居中 text-align: center; ...
- C# AddRange为数组添加多个元素的代码
将代码过程中重要的代码片段做个收藏,下面代码段是关于C# AddRange为数组添加多个元素的代码,希望对小伙伴有所用处.ArrayList ab = new ArrayList();ab.Add(& ...
- Markdown 公式整理
Cmd Markdown 公式指导手册 摘自:Cmd Markdown 公式指导手册 - 作业部落 Cmd Markdown 编辑阅读器 Cmd Markdown 简明语法手册 Cmd Markdow ...
- LOJ#2244 起床困难综合症
解:m = 0的部分分,直接模拟.有and 0的部分分,直接模拟.<=1000的部分分,枚举攻击力之后模拟.所有操作相同的部分分,可以合并成只有一个操作.然后枚举m或者逐位贪心. 正解是逐位贪心 ...
- 对称加密之AES加密详解
最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...
- Sublime Text3—设置快捷键打开浏览器
在不同浏览器查看代码效果可谓是家常便饭,所以用不同快捷键对应打开不同浏览器可以大大提高工作效率. 本篇分享个简单的方法只需二步: 一.安装插件SideBarEnhancements ctrl+shif ...
- 程序人生 | 35岁以上的 iOS 程序员都到哪里去了?
1.网上流传华为公司正在清理 34 岁以上的员工. " 中国区开始集中清理 34 + 的交付员工,...... 去向是跟海外服务部门交换今年新毕业的校招员工,也就是进新人,出旧人. 这些旧人 ...
- \t \r \n \f
\t 的意思是 :水平制表符.将当前位置移到下一个tab位置. \r 的意思是: 回车.将当前位置移到本行的开头. \n 的意思是:回车换行.将当前位置移到下一行的开头. \f的意思是:换页.将当前位 ...
- 并发编程之volatile
用代码描述这么一个场景,在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程结束,t1线程继续执行,直到循环结束 ...
- 小米5如何支持AT&T网络运营商
最近在美帝生活,买了一张H2O的电话卡,但是很不幸,没有办法连接到网络. 在网上翻看了好多帖子,提到说修改APN,但是基本上都没提怎么修改,不知道这些大神都是怎么修改的.于是寻求google帮助,最后 ...