java多线程 操作共享变量 保证原子性
背景:使用多线程统计所有员工每月考勤数据,第一次迟到警告,之后按照规则扣积分,使用AtomicInteger 配合AtomicMarkableReference 实现原子标记,保证所有线程可见,操作原子性
在现实业务场景中,不关心引用变量被修改了几次,只是单纯的关心是否更改过
public static void main(String[] args) {
AtomicInteger v1 =new AtomicInteger(0);
AtomicInteger v2 =new AtomicInteger(1);
AtomicMarkableReference stampedRef =new AtomicMarkableReference<>(v1, false);
// 定义线程实现接口
Runnable runnable =new Runnable(){
IdcardUtilscounter =new IdcardUtils();
@Override
public void run() {
counter.count(v1,v2,stampedRef);
}
};
// 启动10000个线程
for(int i=0;i<10000;i++) {
new Thread(runnable).start();
}
}
// 执行方法
public void count(AtomicInteger v1,AtomicInteger v2,AtomicMarkableReference stampedRef ) {
//java多线程 操作共享变量 保证原子性
boolean flag = stampedRef.compareAndSet(v1, v2, false, true);
if(flag){
System.out.println(Thread.currentThread().getName()+"--未产生标记,进行标记"+stampedRef.getReference());
}else{
// System.out.println(Thread.currentThread().getName()+"--已经产生标记,不进行标记"+stampedRef.getReference());
}
}