设为首页 加入收藏

TOP

Java高并发之无锁与Atomic源码分析(七)
2018-06-09 10:07:57 】 浏览:970
Tags:Java 并发 Atomic 源码 分析

            this.addr = addr;
            this.addr_ind = addr_ind;
            this.oldV = oldV;
            this.newV = newV;
        }


        /**
        * set newV.
        */
        public void doIt() {
            // 这边失败后重试的逻辑在另外的代码里.
            addr.compareAndSet(addr_ind, oldV, newV);
        }
    }


    /**
    * @param <E>
    */
    static class Descriptor<E> {
        public int size;
        volatile WriteDescriptor<E> writeop;


        /**
        * Create a new descriptor.
        *
        * @param size Size of the vector
        * @param writeop Executor write operation
        */
        public Descriptor(int size, WriteDescriptor<E> writeop) {
            this.size = size;
            this.writeop = writeop;
        }


        /**
        *
        */
        public void completeWrite() {
            WriteDescriptor<E> tmpOp = writeop;
            if (tmpOp != null) {
                tmpOp.doIt();
     

          writeop = null; // this is safe since all write to writeop use
                // null as r_value.
            }
        }
    }


    private AtomicReference<Descriptor<E>> descriptor;
    private static final int zeroNumFirst = Integer
            .numberOfLeadingZeros(FIRST_BUCKET_SIZE);


    /**
    * Constructor.
    */
    public LockFreeVector() {
        buckets = new AtomicReferenceArray<AtomicReferenceArray<E>>(N_BUCKET);
        buckets.set(0, new AtomicReferenceArray<E>(FIRST_BUCKET_SIZE));
        descriptor = new AtomicReference<Descriptor<E>>(new Descriptor<E>(0,
                null));
    }


    /**
    * add e at the end of vector.
    * 把元素e加到vector中
    *
    * @param e
    *            element added
    */
    public void push_back(E e) {
        Descriptor<E> desc;
        Descriptor<E> newd;
        do {
            desc = descriptor.get();
            desc.completeWrite();
            // desc.size  Vector 本身的大小
            // FIRST_BUCKET_SIZE  第一个一维数组的大小
    &
编程开发网

首页 上一页 4 5 6 7 8 9 10 下一页 尾页 7/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) }