线程并发学习
线程并发学习—-核心概念(转载)
线程并发学习—-线程阻塞(sleep、wait、notifyAll、notify、join)
线程并发学习—-线程阻塞(synchronized)
线程并发学习—-线程阻塞(lock)
线程并发学习—-Thread、Runnable、Callable
线程并发学习—-队列(Queue)
线程并发学习—-原子类
spring学习—-线程池
java中一些锁概念整理(转载)
简介
Atomic* 是一个支持原子操作的类,如:AtomicInteger 就是保证对 Integer类型变量的增加和减少操作是原子性的,不会出现多个线程下的数据不一致问题。下面使用AtomicInteger类来说明
部分源码
private volatile int value;
//原来实现
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
//java8优化了cas
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
分析
常用方法
incrementAndGet 对当前值实现加1 返回新值
getAndIncrement 对当前值实现加1 返回旧的值
CAS
getAndAddInt方法循环的调用 Sun 的 UnSafe 的 compareAndSwapInt 方法来完成,直到成功退出,此方法为 native 方法,compareAndSwapInt 基于的是 CPU 的 CAS 指令来实现的。所以基于 CAS 的操作可认为是无阻塞的,一个线程的失败或挂起不会引起其它线程也失败或挂起。并且由于 CAS 操作是 CPU 原语,所以性能比较好。
CAS算法
CAS(Compare-And-Swap)算法保证数据操作的原子性。CAS 算法是硬件对于并发操作共享数据的支持。
CAS 包含了三个操作数:
内存值 V
预估值 A
更新值 B
当且仅当 V == A 时,V 将被赋值为 B,否则循环着不断进行判断 V 与 A 是否相等。