volatile关键字与内存可见性&原子变量与CAS算法
1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见
2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量
3 .模拟CAS算法
TestVolatile
package com.aff.juc;
/*
1.volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见
相较于synchronized是一种较为轻量级的同步策略
注意: volatile不具备"互斥性"
不能保证变量的原子性
*/
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
// synchronized (td) {//同步锁,刷新 效率极低
if(td.isFlag()){
System.out.println("------------");
break;
}
//}
}
}
} class ThreadDemo implements Runnable {
private volatile boolean flag = false; @Override
public void run() {
try {
Thread.sleep(10);
} catch (Exception e) {
}
flag = true;
System.out.println("flag=" + isFlag());
} public boolean isFlag() {
return flag;
}
}
TestAtomicDemo
package com.aff.juc; import java.util.concurrent.atomic.AtomicInteger; /*
*
*1. i++ 的原子性问题: i++ 操作实际上分为三步 读-改-写
* int i = 10;
* i = i++;//10
*
* int temp= i;
* i = i +1;
* i = temp;
*2. 原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量
* 1.具有volatile的特性(内存可见性) private volatile int value;
* 2.CAS算法保证数据的 原子性
* CAS算法是硬件对于并发操作共享数据的支持
* CAS包含了三个操作数:
* V内存值
* A预估值
* B更新值
* 当且仅当 V==A, V=B (只有当V和A相等才把B的值赋给V),否则,不做任何操作
*
*/
public class TestAtomicDemo {
public static void main(String[] args) {
AtomicDemo ad = new AtomicDemo();
new Thread(ad).start();
for (int i = 0; i < 10; i++) {
new Thread(ad).start();
}
}
} class AtomicDemo implements Runnable {
// private int serialNumber = 0;
private AtomicInteger serialNumber = new AtomicInteger();// 使用原子变量 @Override
public void run() {
try {
Thread.sleep(200);
} catch (Exception e) {
}
//使用原子变量就不会出现重复的了
System.out.println(Thread.currentThread().getName() + ":" + getSerialNumber()); } public int getSerialNumber() {
// return serialNumber++;
return serialNumber.getAndIncrement();
}
}
TestCompareAndSwap
package com.aff.juc; //模拟CAS算法
public class TestCompareAndSwap {
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 expectedValue = cas.get(); // 获取内存值
boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 100));
System.out.println(b);
}
}).start();
}
}
} class CompareAndSwap {
private int value; // 获取内存值
public synchronized int get() {
return value;
} // 比较
public synchronized int CompareAndSwap(int expectedValue, int newValue) {// expectedValue
// 预估值
int oldValue = value;
if (oldValue == expectedValue) {// 旧的内存值和预估值进行比较
this.value = newValue;// 替换
}
return oldValue;
} // 设置
public synchronized boolean compareAndSet(int expectedValue, int newValue) {
return expectedValue == CompareAndSwap(expectedValue, newValue);
}
}
volatile关键字与内存可见性&原子变量与CAS算法的更多相关文章
- volatile关键字与内存可见性
前言 首先,我们使用多线程的目的在于提高程序的效率,但是如果使用不当,不仅不能提高效率,反而会使程序的性能更低,因为多线程涉及到线程之间的调度.CPU上下文的切换以及包括线程的创建.销毁和同步等等,开 ...
- 【JUC系列第一篇】-Volatile关键字及内存可见性
作者:毕来生 微信:878799579 什么是JUC? JUC全称 java.util.concurrent 是在并发编程中很常用的实用工具类 2.Volatile关键字 1.如果一个变量被volat ...
- 详解volatile 关键字与内存可见性
先来看一个例子: public class VolatileTest { public static void main(String[] args) { T ...
- volatile关键字及内存可见性
先看一段代码: package com.java.juc; public class TestVolatile { public static void main(String[] args) { T ...
- 三、原子变量与CAS算法
原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong ...
- 原子变量与CAS算法(二)
一.锁机制存在的问题 (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)如果一个优先级高的线程等待一个 ...
- 原子变量与CAS算法
原子变量 为了引出原子变量这个概念,我们先看一个例子. package com.ccfdod.juc; public class TestAtomicDemo { public static void ...
- 原子变量与CAS算法小结
CAS算法 CAS(compare-and-swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS是一种无锁非阻塞算法的实现. CAS ...
- Java多线程-----原子变量和CAS算法
原子变量 原子变量保证了该变量的所有操作都是原子的,不会因为多线程的同时访问而导致脏数据的读取问题 Java给我们提供了以下几种原子类型: AtomicInteger和Ato ...
随机推荐
- 蓝色展开收缩悬浮QQ客服代码
放在我的博客首页上的的预览图: 在文章区的预览图如下: 代码如下: <div class="scrollsidebar" id="scrollsidebar&quo ...
- 前端——Vue-cli 通过UI页面创建项目
在使用该教程创建项目时请先安装vue ui,具体安装方法请百度 1.打开CMD,输入vue ui 2.点击创建按钮,选择项目目录 3.填写项目名 4.配置项目 选择项目所需要的模块
- 201771010113 李婷华 《面向对象程序设计(Java)》第十七周总结
一.理论知识部分 Java 的线程调度采用优先级策略:优先级高的先执行,优先级低的后执行:多线程系统会自动为每个线程分配一个优先级,缺省时,继承其父类的优先级: 任务紧急的线程,其优先级较高: 同优先 ...
- 3、Hive-sql优化,数据倾斜处理
一.Hive-sql优化 #增加reducer任务数量(拉取数量分流) ; #在同一个sql中的不同的job是否可以同时运行,默认为false set hive.exec.parallel=true; ...
- 【Hadoop离线基础总结】Hive的基本操作
Hive的基本操作 创建数据库与创建数据库表 创建数据库的相关操作 创建数据库:CREATE TABLE IF NOT EXISTS myhive hive创建表成功后的存放位置由hive-site. ...
- Jekyll 解决Jekyll server本地预览文章not found的问题
layout: post tags: [Jekyll] comments: true 执行Jekyll本地浏览器预览指令 bundle exec jekyll serve 进入浏览器输入127.0.0 ...
- python第七天--文件练
目的: 将不同人物说的话分别保存下来 以==========分段 代码: f=open('record.txt','r',encoding='UTF-8') zyf=[] smy=[] count=1 ...
- P2220 [HAOI2012]容易题(快速幂)
Describe 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值 ...
- API 网关 Kong
什么是 API 网关? 所谓网关,主要作用就是连接两个不同网络的设备,而今天所讲的 API 网关是指承接和分发客户端所有请求的网关层. 为什么需要网关层?最初是单体服务时,客户端发起的所有请求都可以直 ...
- Azure AD B2C(一)初识
一,引言(上节回顾) 上一节讲到Azure AD的一些基础概念,以及如何运用 Azure AD 包含API资源,Azure AD 是微软提供的云端的身份标识和资源访问服务,帮助员工/用户/管理员访问一 ...