设为首页 加入收藏

TOP

Java高并发之无锁与Atomic源码分析(四)
2018-06-09 10:07:57 】 浏览:971
Tags:Java 并发 Atomic 源码 分析
;       }
                      }
                    }
                }
            }.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("没有足够的金额");<

br />                            break;
                        }
                    }
                    try {Thread.sleep(100);} catch (InterruptedException e) {}
                }
            }
        }.start();
    }
 }


支持无锁的数组


主要接口


// 获得数组第i个下标的元素
public final int get(int i)
// 获得数组的长度
public final int length()
// 将数组第i个下标设置为newValue,并返回旧的值
public final int getAndSet(int i, int newValue)
// 进行CAS操作,如果第i个下标的元素等于expect,则设置为update,设置成功返回true
public final boolean compareAndSet(int i, int expect, int update)
// 将第i个下标的元素加1
public final int getAndIncrement(int i)
// 将第i个下标的元素减1
public final int getAndDecrement(int i)
// 将第i个下标的元素增加delta(delta可以是负数)
public final int getAndAdd(int i, int delta)


源码分析


// 数组本身基地址
    private static final int base = unsafe.arrayBaseOffset(int[].class);


    // 封装了一个数组
    private final int[] array;


    static {
        // 数组中对象的宽度, int类型, 4个字节, scale = 4;
        int scale = unsafe.arrayIndexScale(int[].class);
        if ((scale & (scale - 1)) != 0)
            throw new Error("data type scale not a power of two");
        // 前导0 : 一个数字转为二进制后, 他前面0的个数
      &n
编程开发网

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/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) }