首页 » Web前端 » php并发cas技巧_Java并发CAS算法

php并发cas技巧_Java并发CAS算法

访客 2024-12-08 0

扫一扫用手机浏览

文章目录 [+]

这里用到的紧张有三个值

主存值 V :从主存中取出值

php并发cas技巧_Java并发CAS算法

预估值 A :对付非原子性的操作,再进行下一次打算操作之前,会再次读取主存中的值

php并发cas技巧_Java并发CAS算法
(图片来自网络侵删)

更新值 B :根据详细的逻辑,有待跟新的值

在多线程环境下,我们要实现对一个变量自增的话,每每会利用java.util.concurrent.atomic包下的干系实现类。
如下:

public class TestAtomic { public static void main(String[] args) { ThreadDemo td=new ThreadDemo(); //开启二十个线程完成自加操作 for(int x=1;x<=20;x++){ new Thread(td).start(); } }}class ThreadDemo implements Runnable { //定义一个AtomicInteger的初始值为0的变量atoInt private AtomicInteger atoInt=new AtomicInteger(0); @Override public void run() { try { //休眠一下,提高并发性 Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(getNum()); } public int getNum() { //每次返回的为当前值的下一个值 return atoInt.incrementAndGet(); }}123456789101112131415161718192021222324252627282930

这里用到原子并发包装类

1:对付变量,原子性操作都用到了volatile关键字,确保线程之间的可见性。

2:用到了CAS(Compare and Swap)算法

这里有关主存的问题,可以参考 这篇文章,在CAS算法中,如果 V==A 则把B的值复制给V,否则什么也不做,并进行下一次考试测验。

比如 对付 int num=0; i=num++;这个操作 在进行num++这个操作的时候,先从主存中获取num的值,然后再进++操作 很明显这是两个步骤,在获取num的值之后,另一个线程可能已经变动了num的值,这时候加的时候明显有问题 CAS算法如下: 获取主存值 V=0 实行之后,在查看一个主存的值 此时如果还是 A=0(没有线程修正) 根据num++的操作,此时B该当更新到值为0+1=1 V=0 A=0 B=1 由于V==A 此时把B的值刷新到主存中V=1; 如果在一个线程读取之后,另一个线程修正了值,即A=1 V=0 A=1 B=1 V!=A,则不会把B的值刷新到主存中 /

标签:

相关文章

介绍百度码,技术革新背后的智慧之光

随着科技的飞速发展,互联网技术已经成为我们生活中不可或缺的一部分。而在这个信息爆炸的时代,如何快速、准确地获取信息,成为了人们关注...

Web前端 2025-01-03 阅读4 评论0

介绍皮箱密码,开启神秘之门的钥匙

皮箱,作为日常生活中常见的收纳工具,承载着我们的珍贵物品。面对紧闭的皮箱,许多人却束手无策。如何才能轻松打开皮箱呢?本文将为您揭秘...

Web前端 2025-01-03 阅读4 评论0

介绍盗号器,网络安全的隐忧与应对步骤

随着互联网的快速发展,网络安全问题日益突出。盗号器作为一种非法工具,对网民的个人信息安全构成了严重威胁。本文将深入剖析盗号器的原理...

Web前端 2025-01-03 阅读2 评论0