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

/**
    * reserve more space.
    *
    * @param newSize
    *            new size be reserved
    */
    public void reserve(int newSize) {
        int size = descriptor.get().size;
        int pos = size + FIRST_BUCKET_SIZE - 1;
        int i = Integer.numberOfLeadingZeros(FIRST_BUCKET_SIZE)
                - Integer.numberOfLeadingZeros(pos);
        if (i < 1)
            i = 1;

int initialSize = buckets.get(i - 1).length();
        while (i < Integer.numberOfLeadingZeros(FIRST_BUCKET_SIZE)
                - Integer.numberOfLeadingZeros(newSize + FIRST_BUCKET_SIZE - 1)) {
            i++;
            initialSize *= FIRST_BUCKET_SIZE;
            buckets.compareAndSet(i, null, new AtomicReferenceArray<E>(
                    initialSize));
        }
    }

/**
    * size of vector.
    *
    * @return size of vector
    */
    public int size() {
        return descriptor.get().size;
    }

/**
    * {@inheritDoc}
    */
    @Override
    public boolean add(E object) {
        push_back(object);
        return true;
    }
}

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

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