你的位置:首页 > 软件开发 > Java > 【实战Java高并发程序设计 5】让普通变量也享受原子操作

【实战Java高并发程序设计 5】让普通变量也享受原子操作

发布时间:2016-02-18 18:00:05
【实战Java高并发程序设计 1】Java中的指针:Unsafe类【实战Java高并发程序设计 2】无锁的对象引用:AtomicReference【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference【实战Java高并发程序设计 4】 ...

【实战Java高并发程序设计 5】让普通变量也享受原子操作

【实战Java高并发程序设计 1】Java中的指针:Unsafe类

【实战Java高并发程序设计 2】无锁的对象引用:AtomicReference

【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference

【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray

 

   有时候,由于初期考虑不周,或者后期的需求变化,一些普通变量可能也会有线程安全的需求。如果改动不大,我们可以简单地修改程序中每一个使用或者读取这个变量的地方。但显然,这样并不符合软件设计中的一条重要原则——开闭原则。也就是系统对功能的增加应该是开发的,而对修改应该是相对保守的。而且,如果系统里使用到这个变量的地方特别多,一个一个修改也是一件令人厌烦的事情(况且很多使用场景下可能只是只读的,并无线程安全的强烈要求,完全可以保持原样)。

如果你有这种困扰,在这里根本不需要担心,因为在原子包里还有一个实用的工具类AtomicIntegerFieldUpdater。它可以让你在不改动(或者极少改动)原有代码的基础上,让普通的变量也享受CAS操作带来的线程安全性,这样你可以修改极少的代码,来获得线程安全的保证。这听起来是不是让人很激动呢?

根据数据类型不同,这个Updater有3种,分别是AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater。顾名思义,它们分别可以对int、long和普通对象就行CAS修改。

现在来思考这么一个场景。假设某地要进行一次选举。现在模拟这个机票场景,如果选民投了候选人一票,就记为1,否则记为0。最终的选票显然就是所有数据的简单求和。

public class AtomicIntegerFieldUpdaterDemo {  public static class Candidate{    int id;    volatile int score;  }  public final static AtomicIntegerFieldUpdater<Candidate> scoreUpdater     = AtomicIntegerFieldUpdater.newUpdater(Candidate.class, "score");  //检查Updater是否工作正确  public static AtomicInteger allScore=new AtomicInteger(0);  public static void main(String[] args) throws InterruptedException {    final Candidate stu=new Candidate();    Thread[] t=new Thread[10000];    for(int i = 0 ; i < 10000 ; i++) {       t[i]=new Thread() {         public void run() {           if(Math.random()>0.4){            scoreUpdater.incrementAndGet(stu);            allScore.incrementAndGet();          }        }       };      t[i].start();    }     for(int i = 0 ; i < 10000 ; i++) { t[i].join();}    System.out.println("score="+stu.score);    System.out.println("allScore="+allScore);  }}

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:【实战Java高并发程序设计 5】让普通变量也享受原子操作

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。