api: floaty

This commit is contained in:
hyb1996
2017-12-30 15:23:48 +08:00
parent f39516a4b4
commit 6d9fda6862
15 changed files with 142 additions and 42 deletions

View File

@@ -0,0 +1,62 @@
package com.stardust.concurrent;
import java.lang.reflect.Array;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by Stardust on 2017/12/30.
*/
public class ConcurrentArrayList<T> {
private final Class<T> mTClass;
private volatile T[] mArray;
private final AtomicInteger mSize = new AtomicInteger();
private final Object mArrayResizeLock = mSize;
public ConcurrentArrayList(Class<T> tClass) {
mTClass = tClass;
mArray = newArray(10);
}
public void add(T element) {
int index = mSize.getAndIncrement();
ensureCapacity(index);
mArray[index] = element;
}
@SuppressWarnings("unchecked")
public T get(int i) {
int size = mSize.get();
if (i >= size) {
throw new IndexOutOfBoundsException("i = " + i + ", size = " + size);
}
return mArray[i];
}
public int size() {
return mSize.get();
}
public Object getArrayResizeLock() {
return mArrayResizeLock;
}
@SuppressWarnings("unchecked")
private T[] newArray(int size) {
return (T[]) Array.newInstance(mTClass, size);
}
private void ensureCapacity(int index) {
if (index < mArray.length)
return;
synchronized (mArrayResizeLock) {
if (index < mArray.length)
return;
T[] newArray = newArray(mArray.length * 2);
System.arraycopy(mArray, 0, newArray, 0, mArray.length);
mArray = newArray;
}
}
}