Java高并发之无锁与Atomic源码分析(3)

// 进行cas操作的时候, 会对比stamp的值
    public boolean compareAndSet(V  expectedReference,
                                V  newReference,
                                int expectedStamp,
                                int newStamp) {
        Pair<V> current = pair;
        return
            expectedReference == current.reference &&
            expectedStamp == current.stamp &&
            ((newReference == current.reference &&
              newStamp == current.stamp) ||
            casPair(current, Pair.of(newReference, newStamp)));
    }

Demo

后台使用多个线程对用户充值, 要求只能充值一次

public class AtomicStampedReferenceDemo {
 static AtomicStampedReference<Integer> money=new AtomicStampedReference<Integer>(19,0);
    public staticvoid main(String[] args) {
        //模拟多个线程同时更新后台数据库,为用户充值
        for(int i = 0 ; i < 3 ; i++) {
            final int timestamp=money.getStamp();
            newThread() { 
                public void run() {
                    while(true){
                      while(true){
                          Integerm=money.getReference();
                            if(m<20){
                        if(money.compareAndSet(m,m+20,timestamp,timestamp+1)){
                          System.out.println("余额小于20元,充值成功,余额:"+money.getReference()+"元");
                                    break;
                                }
                            }else{
                              //System.out.println("余额大于20元,无需充值");
                                break ;
                            }
                      }
                    }
                }
            }.start();
        }
       
      //用户消费线程,模拟消费行为
        new Thread() {
            publicvoid run() {
                for(int i=0;i<100;i++){
                  while(true){
                        int timestamp=money.getStamp();
                        Integer m=money.getReference();
                        if(m>10){
                            System.out.println("大于10元");
                            if(money.compareAndSet(m, m-10,timestamp,timestamp+1)){
                             System.out.println("成功消费10元,余额:"+money.getReference());
                                break;
                            }
                        }else{
                          System.out.println("没有足够的金额");
                            break;
                        }
                    }
                    try {Thread.sleep(100);} catch (InterruptedException e) {}
                }
            }
        }.start();
    }
 }

AtomicIntegerArray

支持无锁的数组

主要接口

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/51b69d57160bd926d840d2e47e93aab2.html