原子类通过(CAS和volatile)实现单共享变量的线程安全

对于CAS是一种有别于synchronized的一种乐观锁实现.是一种非阻塞锁算法.CAS通过与原始预期值进行比较来确定是否修改主内存中数据的一种方案.基于一个线程的失败或者挂起不应该影响其他线程的失败或挂起这样的前提,而提出硬件层次的实现数据处理的互斥。可以自动更新共享数据,而且能够检测到其他线程的干扰,而
compareAndSet() 就用这些代替了锁定。对于实现CAS的原子类(AtomicInteger等)不仅仅对于单个贡献变量保证了原子性,同时借助volatile变量让共享变量保持可见性.,那么对于单个共享变量而言是可以实现线程安全的通信的,是不需要阻塞的同步方式比如synchronized实现同步。
下面我们通过一个例子来学习银行多线程并发取钱的实例.

1.单共享变量操作类

public class AtmicCounter {

private  AtomicLong    balance;

public  AtmicCounter(long  money)

{

balance=new  AtomicLong(money);

System.out.println("当前金额--->"+balance);

}

//存钱

public  void  deposit(long money)

{

balance.addAndGet(money);

}

//取钱(取money这么多钱)

public  void  withDraw(long  money)

{

//取得当前值

long  oldValue=this.balance.get();

if(oldValue>0)

{

try {

Thread.sleep(10);

if(this.balance.compareAndSet(oldValue, oldValue-money))

{

System.out.println(Thread.currentThread().getName()+" withDraw "+oldValue +" successful!!");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

2.测试类

public class AtomicCounterTest  extends  Thread{

private  AtmicCounter   counter;

public  AtomicCounterTest(AtmicCounter   counter)

{

this.counter=counter;

}

public  void  run()

{

while(true){

this.counter.withDraw(1);

}

}

/**

* 银行取钱测试

*/

public static void main(String[] args) {

AtmicCounter   counter=new AtmicCounter(100);

AtomicCounterTest   test1=new AtomicCounterTest(counter);

AtomicCounterTest   test2=new AtomicCounterTest(counter);

AtomicCounterTest   test3=new AtomicCounterTest(counter);

AtomicCounterTest   test4=new AtomicCounterTest(counter);

test1.start();

test2.start();

test3.start();

test4.start();

}

}

小结:对于单变量情况可以通过原子类保证线程安全,但是多个共享变量不能保证.

原子类通过(CAS和volatile)实现单共享变量的线程安全

时间: 2024-11-05 21:47:44

原子类通过(CAS和volatile)实现单共享变量的线程安全的相关文章

并发编程之原子类

Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单.性能高效.线程安全地更新一个变量的方式. ?? 内部都是采用CAS+volatile实现了无锁并发 这节不讲原理,只讲如何使用. 整体结构 从整体上可以分为5组,分别进行说明 ? 基本类型 使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数

Java多线程系列---“JUC原子类”01之 原子类的实现(CAS算法)

转自:https://blog.csdn.net/ls5718/article/details/52563959  & https://blog.csdn.net/mmoren/article/details/79185862(含部分修改) 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)

Netty的并发编程实践3:CAS指令和原子类

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能的额外损耗,因此这种同步被称为阻塞同步,它属于一种悲观的并发策略,我们称之为悲观锁.随着硬件和操作系统指令集的发展和优化,产生了非阻塞同步,被称为乐观锁.简单地说,就是先进行操作,操作完成之后再判断操作是否成功,是否有并发问题,如果有则进行失败补偿,如果没有就算操作成功,这样就从根本上避免了同步锁的弊端. 目前,在Java中应用最广泛的非阻塞同步就是CAS,在IA64.X86指令集中通过cmpxchg指令完成CAS功能,在sparc-TSO中

java多线程系类:JUC原子类:04之AtomicReference原子类

概要 本章对AtomicReference引用类型的原子类进行介绍.内容包括:AtomicReference介绍和函数列表AtomicReference源码分析(基于JDK1.7.0_40)AtomicReference示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514623.html AtomicReference介绍和函数列表 AtomicReference是作用是对"对象"进行原子操作. AtomicReference函数列

java多线程系类:JUC原子类:05之AtomicIntegerFieldUpdater原子类

概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法相似.本章以对基本类型的原子类进行介绍.内容包括:AtomicLongFieldUpdater介绍和函数列表AtomicLongFieldUpdater示例AtomicLongFieldUpdater源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.com

Java并发编程-非阻塞同步方式原子类(Atomic)的使用

非阻塞同步 在大多数情况下,我们为了实现线程安全都会使用Synchronized或lock来加锁进行线程的互斥同步,但互斥同步的最主要的问题就是进行线程的阻塞和唤醒所带来的性能问题,因此这种阻塞也称作阻塞同步.从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会进行加锁.用户态核心态转换.维护锁的计数器和检查是否有被阻塞的线程需要被唤醒等操作. 随着硬件指令集的发展,我们有了另一个选择:基于冲突检测的乐

JAVA多线程之JUC原子类

JUC原子类框架 JUC即是指:java.util.concurrent包. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ; 引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkab- leReference ; 对象的属性修改类型: AtomicIntege

juc原子类

0原子类 http://www.cnblogs.com/skywang12345/p/3514589.htmlhttp://www.blogjava.net/xylz/archive/2010/07/01/324988.html 根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicRefer

java 多线程系列---JUC原子类(二)之AtomicLong原子类

概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍. AtomicLong介绍和函数列表 AtomicLong是作用是对长整形进行原子操作.在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性.而使用AtomicLong能让long的操作保持原子型. AtomicLong函数列表 // 构造函数 Ato