并发编程(三)__模拟CAS算法

 1 /*
 2  * 模拟 CAS 算法
 3  */
 4 public class TestCompareAndSwap {
 5
 6     public static void main(String[] args) {
 7         final CompareAndSwap cas = new CompareAndSwap();
 8
 9         for (int i = 0; i < 10; i++) {
10             new Thread(new Runnable() {
11
12                 @Override
13                 public void run() {
14                     int expectedValue = cas.get();
15                     boolean b = cas.compareAndSet(expectedValue, (int)(Math.random() * 101));
16                     System.out.println(b);
17                 }
18             }).start();
19         }
20
21     }
22
23 }
24
25 class CompareAndSwap{
26     private int value;
27
28     //获取内存值
29     public synchronized int get(){
30         return value;
31     }
32
33     //比较
34     public synchronized int compareAndSwap(int expectedValue, int newValue){
35         int oldValue = value;
36
37         if(oldValue == expectedValue){
38             this.value = newValue;
39         }
40
41         return oldValue;
42     }
43
44     //设置
45     public synchronized boolean compareAndSet(int expectedValue, int newValue){
46         return expectedValue == compareAndSwap(expectedValue, newValue);
47     }
48 }

原文地址:https://www.cnblogs.com/dreamHighMjc/p/8497085.html

时间: 2024-11-13 01:27:57

并发编程(三)__模拟CAS算法的相关文章

Java并发编程三个性质:原子性、可见性、有序性

并发编程 并发程序要正确地执行,必须要保证其具备原子性.可见性以及有序性:只要有一个没有被保证,就有可能会导致程序运行不正确 线程不安全在编译.测试甚至上线使用时,并不一定能发现,因为受到当时的CPU调度顺序,线程个数.指令重排的影响,偶然触发 线程安全的定义 比如说一个类,不论通过怎样的调度执行顺序,并且调用处不用对其进行同步操作,其都能表现出正确的行为,则这个类就是线程安全的 并发编程三个概念 原子性: 一个操作或多个操作要么全部执行且执行过程不被中断,要么不执行 可见性: 多个线程修改同一

GUC-1 模拟CAS算法

/* * 模拟 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 =

并发编程三要素:原子性,有序性,可见性

并发编程三要素 原子性:一个不可再被分割的颗粒.原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性: 程序执行的顺序按照代码的先后顺序执行.(处理器可能会对指令进行重排序) 可见性: 一个县城对共享变量的修改,另一个线程能够立刻看到. 一.原子性 线程切换会带来原子性的问题 int i = 1; // 原子操作 i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到主内存. 虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为"

Java并发编程:什么是CAS?这回总算知道了

无锁的思想 众所周知,Java中对并发控制的最常见方法就是锁,锁能保证同一时刻只能有一个线程访问临界区的资源,从而实现线程安全.然而,锁虽然有效,但采用的是一种悲观的策略.它假设每一次对临界区资源的访问都会发生冲突,当有一个线程访问资源,其他线程就必须等待,所以锁是会阻塞线程执行的. 当然,凡事都有两面,有悲观就会有乐观.而无锁就是一种乐观的策略,它假设线程对资源的访问是没有冲突的,同时所有的线程执行都不需要等待,可以持续执行.如果遇到冲突的话,就使用一种叫做CAS (比较交换) 的技术来鉴别线

并发编程的灵魂:CAS机制详解

Java中提供了很多原子操作类来保证共享变量操作的原子性.这些原子操作的底层原理都是使用了CAS机制.在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使用CAS机制. 其实Java并发框架的基石一共有两块,一块是本文介绍的CAS,另一块就是AQS,后续也会写文章介绍. 什么是CAS机制 CAS机制是一种数据更新的方式.在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模

漫谈并发编程(三):共享受限资源

解决共享资源竞争 一个不正确的访问资源示例 考虑下面的例子,其中一个任务产生偶数,而其他任务消费这些数字.这里,消费者任务的唯一工作就是检查偶数的有效性. 我们先定义一个偶数生成器的抽象父类. public abstract class IntGenerator { private volatile boolean canceled = false; public abstract int next( ); public void cancle( ) { canceled = true; } p

并发编程-硬件加持的CAS操作够快么?

Talk is cheap CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新值(B).如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值.否则,处理器不做任何操作.无论位置V的值是否等于A, 都将返回V原有的值. CAS的含义是"我认为V的值应该是A,如果是,那我将V的值更新为B,否则不修改并告诉V的值实际是多少" Show you my co

Java并发编程(三) 并发类库中的常用类

1. 同步容器类 遗留下来的同步容器类包括Vector和Hashtable,此外java.util.Collections类中还提供了以下工厂方法创建线程安全的容器对象: Collections.synchronizedList 返回支持同步操作(线程安全)的List对象: Collections.synchronizedSet 返回支持同步操作(线程全的)的Set对象: Collections.synchronizedMap 返回支持同步操作(线程安全)的Map对象: 需要注意的是,同步容器类

Java并发编程总结2——慎用CAS(转)

一.CAS和synchronized适用场景 1.对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源:而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能. 2.对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized.以java.util.concurrent.atomic包中AtomicInteger类为例,其getAn