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 = 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);
    }
}

原文地址:https://www.cnblogs.com/surge/p/10476224.html

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

GUC-1 模拟CAS算法的相关文章

并发编程(三)__模拟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 vo

CAS算法

1 /** 2 * CAS(Compare-And-Swap)算法保证了数据的原子性 3 * CAS算法是硬件对于并发操作共享数据的支持 4 * CAS包含了3个操作数: 5 * 内存值 V 看成两步 读取内存值为1步 6 * 7 * 预估值 A 后面两步同时发生 8 * 更新值 B 9 * 当且仅当V == A时,V = B,否则不做任何操作 10 * 下面用Java锁模拟CAS算法: 11 */ 12 public class CAS { 13 14 15 private int value

三、原子变量与CAS算法

原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong - AtomicReference - AtomicIntegerArray - AtomicLongArray - AtomicMarkableReference - AtomicReferenceArray - AtomicStampedReference 1.以上类中的变量都是volatil

原子变量和CAS算法以及ConcurrentHashMap

1.首先做一个测试:i++.输出结果为10,因为在底层实现的时候会引入一个临时变量具体为: 1 public static void main(String[] args) { 2 //i++测试: 3 int i=10; 4 i=i++; 5 System.out.println(i); 6 /* 7 *底层原理: 8 _temp = i ; 9 i = i + 1 ; 10 i = _temp ; 11 * */ 12 } 所以i++就是一个非原子性操作,采用多线程再次测试:测试结果中会因为

juc-2.1-模拟CAS算法

package com.wf.zhang.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 r

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

1 .volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 2 .原子变量:jdk1.5后java.util.concurrent.atomic 包下提供常用的原子变量 3 .模拟CAS算法 TestVolatile package com.aff.juc; /* 1.volatile 关键字:当多个线程进行操作共享数据时, 可以保证内存中的数据可见 相较于synchronized是一种较为轻量级的同步策略 注意: volatile不具备"互斥性" 不能保

poj1379+POJ2420+hdu3932(最短距离+费马点+模拟淬火算法)

Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5632   Accepted: 1729 Description One of the traps we will encounter in the Pyramid is located in the Large Room. A lot of small holes are drilled into the floor. They look complet

原子变量与CAS算法

上一节讨论了 volatile关键字,volatile关键字修饰的作用是不具有 "原子性" 和 "互斥性的" 例如 i++ 操作 就不是一个原子性的操作,i++ 其实分为3个步骤进行 "读-改-写" int temp = i; i = i + 1; i= temp; 先看一段代码: package com.java.juc; public class TestAtomicDemo { public static void main(String[

poj2069+hud3007(点的最小球(圆)覆盖+模拟淬火算法)

Super Star Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3198   Accepted: 853   Special Judge Description During a voyage of the starship Hakodate-maru (see Problem 1406), researchers found strange synchronized movements of stars. Havi