AtomicInteger具有原子性,线程安全的操作,相比Integer加锁的方式更简洁;
使用场景:线程并发访问、
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
// setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
//注意volatile
private volatile int value;
getAndIncrement()返回旧值、
incrementAndGet() 返回增加后的新值、
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
public class CopyOnWriteArraySetextends AbstractSetimplements Serializable
对于CopyOnWriteArraySet类:
1它最适合于具有以下特征的应用程序:set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
2它是线程安全的, 底层的实现是CopyOnWriteArrayList;
3因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等的开销很大。
4迭代器不支持可变 remove 操作。
5使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
原文:https://blog.csdn.net/u012956987/article/details/50811703