原子变量

     原子变量保证了该变量的所有操作都是原子的,不会因为多线程的同时访问而导致脏数据的读取问题

     Java给我们提供了以下几种原子类型:

  • AtomicInteger和AtomicIntegerArray:基于Integer类型
  • AtomicBoolean:基于Boolean类型
  • AtomicLong和AtomicLongArray:基于Long类型
  • AtomicReference和AtomicReferenceArray:基于引用类型

1.非原子操作

package com.thread.atomic;

/**
* 非原子操作
*
* @author yyx 2019年1月14日
*/
public class NoAtomic {
public static void main(String[] args) {
NoAtomicDemo noAtomicDemo = new NoAtomicDemo();
for (int i = 0; i < 10; i++) {
new Thread(noAtomicDemo).start();
}
}
} class NoAtomicDemo implements Runnable {
private volatile int serialNumber = 0; @Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
} System.out.print(getSerialNumber()+" ");
} public int getSerialNumber() {
return serialNumber++;
}
}
运行结果的一种:0 0 5 7 4 1 2 3 7 6 

2.原子操作

package com.thread.atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
* 原子操作
*
* @author yyx 2019年1月14日
*/
public class HaveAtomic {
public static void main(String[] args) {
HaveAtomicDemo hAtomicDemo = new HaveAtomicDemo();
for (int i = 0; i < 10; i++) {
new Thread(hAtomicDemo).start();
}
}
} class HaveAtomicDemo implements Runnable {
private AtomicInteger aInteger = new AtomicInteger(); @Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
} System.out.print(getaInteger() + " ");
} public int getaInteger() {
return aInteger.getAndIncrement();
}
}
运行结果的一种:0 2 7 8 9 5 6 3 4 1 

   CAS算法思想

     三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false

package com.thread.atomic;

/**
* 模拟 CAS 算法
*
* @author yyx 2019年1月14日
*/
public class CASAlgorithm {
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() * 101));
System.out.println(b);
}
}).start();
}
}
} class CompareAndSwap {
private int value; // 获取内存值
public synchronized int get() {
return value;
} // 比较
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value; if (oldValue == expectedValue) {
this.value = newValue;
} return oldValue;
} // 设置
public synchronized boolean compareAndSet(int expectedValue, int newValue) {
return expectedValue == compareAndSwap(expectedValue, newValue);
}
}

Java多线程-----原子变量和CAS算法的更多相关文章

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

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

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

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

  3. 原子变量与CAS算法

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

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

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

  5. volatile关键字与内存可见性&原子变量与CAS算法

    1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量 ...

  6. java的原子变量

    java的原子变量类似c++的InterlockedDecrement()操作.其实就是在进行算术时,把整个算式看为一个整体,并且保证同一时间只计算该式子一次. 它的用途比如,多个线程可能会调用某个函 ...

  7. java多线程 -- 原子量 变量 CAS

    多线程原子性问题的产生和解决 原子变量:在 java.util.concurrent.atomic 包下提供了一些原子变量. 1. volatile 保证内存可见性,可以查看atomic中变量是使用v ...

  8. Java编程的逻辑 (70) - 原子变量和CAS

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  9. java并发编程学习: 原子变量(CAS)

    先上一段代码: package test; public class Program { public static int i = 0; private static class Next exte ...

随机推荐

  1. spring根据name或者id获取实例

    @Resource(name="beanname") private ClassType scheduler; 其中ClassType需要跟实例的类型对应上.

  2. webpack中loader和plugin的概念理解

    对于 loader ,它就是一个转换器,将A文件进行编译形成B文件,这里操作的是文件,比如将 A.scss 或 A.less 转变成 B.css,单纯的文件转换过程: 对于 plugin,它就是一个扩 ...

  3. cmd远程连接oracle

    sqlplus 用户名/密码@IP:端口号/oracle实例

  4. 怎么使用JavaScript进行进制转换

    JS 是一个很神奇的语言,内制的的很多函数可以帮我们进行数(进)制转换: JS中可以直接使用16进制: var a = 0xff; //255 将任意进制字符串转换为十进制,如二进制,八进制,十六进制 ...

  5. 接口测试工具-Jmeter使用笔记(三:管理请求服务器信息和Headers参数)

    如果使用Jmeter同时执行多个http请求任务,就需要创建多个HTTP取样器,每一个取样器都来手动填写服务器信息和端口号,会非常消耗时间. 解决方法:Jmeter之HTTP请求默认值 1.添加方式 ...

  6. C++中的内存区域及其性能特征

    首先须要指出的是.我们通经常使用"堆"和"自由存储"这两个术语来区分两种不同类型的动态分配内存. 1.常量数据:常量数据区域主要用于存储字符串以及其它在编译期就 ...

  7. mysql常用反斜杠命令

    mysql常用反斜杠命令 https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html https://dev.mysql.com/doc/r ...

  8. SQL SERVER 2016研究三

    2016 SQL SEVER 全程加密程式 column encryption setting=Enabled; 重点:需要使用.Net Framework 4.6 新建一个程式如下: 1.创建链接数 ...

  9. 002-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-第二章 构建业务中台的基础-共享服务体系简介

    2.1.回归SOA的本质-服务重用 SOA理念的核心价值:松耦合的服务带来业务的复用,通过服务的编排助力业务的快速响应和创新. 现有模式多是烟囱式结合 ESB 企业总线打通不同系统间的交互. 2.2. ...

  10. 永久有效的 webstorm license server 20180808

    下载地址  https://download.jetbrains.com/webstorm/WebStorm-2018.3.2.exe 2018年10月26日,最近老是过期,搞了一个1年有效的代码,是 ...