设为首页 加入收藏

TOP

Java高并发之无锁与Atomic源码分析(三)
2018-06-09 10:07:57 】 浏览:967
Tags:Java 并发 Atomic 源码 分析
ce, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        static <T> Pair<T> of(T reference, int stamp) {
            return new Pair<T>(reference, stamp);
        }
    }


    private volatile Pair<V> pair;


    // 进行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 ;
                     
编程开发网

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JDK并发包详细总结 下一篇Java内存模型与指令重排

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }