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算法的更多相关文章

  1. volatile关键字与内存可见性

    前言 首先,我们使用多线程的目的在于提高程序的效率,但是如果使用不当,不仅不能提高效率,反而会使程序的性能更低,因为多线程涉及到线程之间的调度.CPU上下文的切换以及包括线程的创建.销毁和同步等等,开 ...

  2. 【JUC系列第一篇】-Volatile关键字及内存可见性

    作者:毕来生 微信:878799579 什么是JUC? JUC全称 java.util.concurrent 是在并发编程中很常用的实用工具类 2.Volatile关键字 1.如果一个变量被volat ...

  3. 详解volatile 关键字与内存可见性

    先来看一个例子: public class VolatileTest {            public static void main(String[] args) {           T ...

  4. volatile关键字及内存可见性

    先看一段代码: package com.java.juc; public class TestVolatile { public static void main(String[] args) { T ...

  5. 三、原子变量与CAS算法

    原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong ...

  6. 原子变量与CAS算法(二)

    一.锁机制存在的问题 (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)如果一个优先级高的线程等待一个 ...

  7. 原子变量与CAS算法

    原子变量 为了引出原子变量这个概念,我们先看一个例子. package com.ccfdod.juc; public class TestAtomicDemo { public static void ...

  8. 原子变量与CAS算法小结

    CAS算法 CAS(compare-and-swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS是一种无锁非阻塞算法的实现. CAS ...

  9. Java多线程-----原子变量和CAS算法

       原子变量      原子变量保证了该变量的所有操作都是原子的,不会因为多线程的同时访问而导致脏数据的读取问题      Java给我们提供了以下几种原子类型: AtomicInteger和Ato ...

随机推荐

  1. badboy 录制脚本

    第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...

  2. python sort和sorted的区别

    sort 与 sorted 区别: sort 是应用在 list 上的方法,使用方法为 list.sort(),是对原有列表进行操作,改变原有列表的排序: sorted 可以对所有可迭代的对象进行排序 ...

  3. 虚拟机部署单机版kubernetes,minikube,docker

    # 目前公司用的是阿里云的容器服务 所以本地搭建个单机版 方便测试使用# VMware® Workstation 12 Pro 版本# 虚拟机环境配置:配置 2核 4G 网络桥接# 系统镜像: Cen ...

  4. 《Docker从入门到跑路》之基本用法介绍

    Docker是一种轻量级的虚拟化技术,它具备传统虚拟机无法比拟的优势,它更简易的安装和使用方式.更快的速度.服务集成和开源流程自动化. Docker的安装 安装Docker的基本要素:1.Docker ...

  5. Lowest Common Ancestor of a Binary Search Tree(树中两个结点的最低公共祖先)

    题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...

  6. CSS的基础使用

    一,css是什么? CSS全称为“层叠样式表” ,与HTML相辅相成,实现网页的排版布局与样式美化 二,CSS使用方式 1.行内样式/内联样式(单一页面中使用) 借助于style标签属性,为当前的标签 ...

  7. NSNotification,NSNotificationCenter的使用、iOS中五种对象间传值的方式

    学习内容 NSNitification与NotificationCenter(通知与通知中心) 通知的使用 [[NSNotificationCenter defaultCenter]addObserv ...

  8. 王颖奇 201771010129《面向对象程序设计(java)》第四周学习总结

    实验四 类与对象的定义及使用 实验时间 2018-9-20 1.目的与要求 学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定义类的基本使用方法,熟悉Math ...

  9. Coursera课程笔记----计算导论与C语言基础----Week 7

    C语言中的数据成分(Week7) 内存 把内存想象成长带,带子上有许多方格,每个方格有8位(8bit) 2^10 = 1024 1B = 8 b 1KB = 1024Byte MB.GB.TB.PB- ...

  10. React Native 架构一览

    一.架构设计 整体上分为三大块,Native.JavaScript 与 Bridge: Native 管理 UI 更新及交互,JavaScript 调用 Native 能力实现业务功能,Bridge ...