mysql解决aba问题_AtomicStampedReference解决CAS的ABA问题
AtomicStampReference
> 解决CAS的ABA问题
什么是ABA
> ABA问题:指CAS操作的时候,线程将某个变量值由A修改为B,但是又改回了A,其他线程发现A并未改变,于是CAS将进行值交换操作,实际上该值已经被改变过,这与CAS的核心思想是不符合的
ABA解决方案
> 每次变量更新的时候,把变量的版本号进行更新,如果某变量被某个线程修改过,那么版本号一定会递增更新,从而解决ABA问题
AtomicReference 演示ABA问题
package com.keytech.task;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
public class AtomicIntegerTest {
private static AtomicReference count=new AtomicReference<>(10);
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(()->{
boolean b = count.compareAndSet(10, 12);
if(b){
System.out.println(Thread.currentThread().getName()+"修改成功count="+count.get());
}
boolean c =count.compareAndSet(12, 10);
if(c){
System.out.println(Thread.currentThread().getName()+"修改成功count="+count.get());
}
});
executorService.execute(()->{
boolean b = count.compareAndSet(10, 100);
if(b){
System.out.println(Thread.currentThread().getName()+"修改成功count="+count.get());
}
});
executorService.shutdown();
}
}
//pool-1-thread-1修改成功count=12
//pool-1-thread-1修改成功count=10
//pool-1-thread-2修改成功count=100
> pool-1-thread-1将count由10修改成12,又将count从12改成10。 pool-1-thread-2将count从10成功改成100。出现了ABA的问题。
AtomicStampedReference解决ABA的问题
> 以计数器的实现为例,计数器通常用来统计在线人数,在线+1,离线-1,是ABA的典型场景。
package com.keytech.task;
import java.util.concurrent.atomic.AtomicStampedReference;
public class CounterTest {
private AtomicStampedReference count=new AtomicStampedReference(0,0);
public int getCount(){
return count.getReference();
}
public int increment(){
int[] stamp=new int[1];
while (true){
Integer value = count.get(stamp);
int newValue=value+1;
boolean b = count.compareAndSet(value, newValue, stamp[0], stamp[0] + 1);
if(b){
return newValue;
}
}
}
public int decrement(){
int[] stamp=new int[1];
while(true){
Integer value=count.get(stamp);
int newValue=value-1;
boolean b = count.compareAndSet(value, newValue, stamp[0], stamp[0] + 1);
if(b){
return newValue;
}
}
}
}
调用计数器
package com.keytech.task;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
public class AtomicIntegerTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
Semaphore semaphore=new Semaphore(200);
CounterTest counterTest=new CounterTest();
for (int i = 0; i < 5000; i++) {
executorService.execute(()->{
try{
semaphore.acquire();
counterTest.increment();
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}
});
executorService.execute(()->{
try{
semaphore.acquire();
counterTest.decrement();
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}
});
}
executorService.shutdown();
System.out.println(counterTest.getCount());
}
}
//输出0
AtomicBoolean保证高并发下只执行一次
package com.keytech.task;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicBoolean;
public class AtomicBooleanTest {
private static AtomicBoolean isHappen=new AtomicBoolean(false);
public static int clientTotal=5000;
public static int threadTotal=200;
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
Semaphore semaphore=new Semaphore(threadTotal);
for (int i = 0; i < clientTotal; i++) {
executorService.execute(()->{
try {
semaphore.acquire();
update();
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}
});
}
executorService.shutdown();
}
private static void update(){
if(isHappen.compareAndSet(false, true)){
System.out.println("只执行一次");
}
}
}
//只执行一次
mysql解决aba问题_AtomicStampedReference解决CAS的ABA问题相关推荐
- cas引出的ABA问题?如何解决?- 理解原子引用、时间戳(版本号)原子引用
ABA问题: 假如有两个线程1,2: cas下:1.线程取值完等待,2线程取值并把A改成B,有把B改成A,这是1线程执行会任务A还是原来的A没有发生改变,如果不在乎中间结果,只看收尾,那么没必要解决A ...
- AtomicStampedReference解决CAS的ABA问题
AtomicStampReference 解决CAS的ABA问题 什么是ABA ABA问题:指CAS操作的时候,线程将某个变量值由A修改为B,但是又改回了A,其他线程发现A并未改变,于是CAS将进行值 ...
- CAS详解及ABA问题的解决
序言 由于最近项目上遇到了高并发问题,而自己对高并发,多线程这里的知识点相对薄弱,尤其是基础,所以想系统的学习一下,以后可能会出一系列的JUC文章及总结 ,同时也为企业级的高并发项目做好准备. 本文是 ...
- CAS中ABA问题的解决
什么是CAS? Compare and Swap (比较交换),使用CAS来保证线程的对变量的原子操作,避免被其他线程所干扰. CAS原理:其中包含三个参数 要修改的变量 变量的预期值 要更性的参数 ...
- JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类
文章目录 JUC04 课程任务概览 CAS CAS原理简介 CAS发展: CAS是什么? CAS原理: CAS优点: **CAS底层实现-引出Unsafe类** ==CAS自旋实现个人总结== Ato ...
- ABA问题的解决方法
CAS操作可能带来ABA问题,因为CAS操作需要在操作值的时候,检查值有没有发生变化,如果没有发发生变化则更新.如果一个值原理是A,变成了B,又变成了A,那么使用CAS进行检查时会认为它的值没有变化, ...
- mysql unrecognized_service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误...
service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误的方法如下: [root@ctohome.com ~]# service ...
- linux下mysql的root密码忘记解决方
linux下mysql的root密码忘记解决方 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没 ...
- 老男孩教育每日一题-2017年4月28日- MySQL主从复制常见故障及解决方法?
MySQL主从复制常见故障及解决方法? 1.1.1故障1:从库数据与主库冲突 show slave status; 报错:且show slave status\G Slave_I/O_Running: ...
最新文章
- 内存分配策略(一):JVM栈桢及方法调用详解
- java class 使用_Java反射机制(Class类的使用)
- python干啥用的啊-python干什么用的
- c++标准库中,含有链表的类list
- 侯捷面向对象高级编程(二)
- python安装opencv出现错误_Python3安装OpenCV出错,如何解决?
- Java面试知识点:Date类、异常
- 倒计时3天!携手开发者,一起精准打造数智未来!
- Java判断一个数是不是素数
- L255 Learning to say no brings a thrill of freedom
- 自然语言处理实战-Python编程进阶
- Nagios的安装与配置并实现飞信报警
- 表达式语言输出map
- 本地与服务器文件同步软件哪个好,同步软件哪个好,亲身体验的3款免费同步软件介绍...
- 基于Hadoop的数据分析案例-陌陌聊天软件数据分析
- 市政基础设施工程与建筑工地施工人员安全管理实名制通道系统的应用与解决方案
- 系统找不到指定路径,网络编程
- 2021年焊工(初级)考试报名及焊工(初级)实操考试视频
- 微信小程序 getLocation:fail auth deny
- 反射如何打破封装性_打破产品建议的复杂性