- 기본 카테고리 :
- AtomicInteger
- AtomicLong
- AtomicBoolean
- Array 타입 :
- AtomicIntegerArray
- AtomicLongArray
- 의 AtomicReferenceArray
소개
때문에 멀티 스레드 환경에서, 당신이 공유 변수에 대해 우리는 보안 스레드가 다음과 같은 방법을 가지고 확인해야하므로, 데이터 불일치가 발생할 가능성이 공유 변수를 수정하는 경우 :
- 사용
lock
또는synchronized
공유 변수를 동기화 - CAS는 자성 동작을 보장하기 위해 변수를 수정하는 방법을 사용
후자의 클래스는 원자 수정 CAS를 기반으로합니다.
원리
- 진실 부울 변환
int
유형은 표시 : 1은 0이 허위 사실 나타냄 - 클래스에서 초기화 할 때 메모리 주소의 값을 얻을 수
- 호출
Unsafe.compareAndSwant
메소드 CAS 값의 기본 원리 (CMPXCHG CPU의 지시)를 변경
특징
- 스레드 안전을 보장 CAS를 기반으로
- 구현
Cloneable
인터페이스를 복제 할 - 그것은 구현
Serializable
인터페이스, 지원 직렬화 전송
소스 해결
멤버 변수
private static final long serialVersionUID = 4654671469794556979L;
// setup to use Unsafe.compareAndSwapInt for updates
//使用unsafe类进行cas
private static final Unsafe unsafe = Unsafe.getUnsafe();
//获取该值得偏移量(内存中的地址)
private static final long valueOffset;
/**
* 内部使用int来做boolean的设置
* 默认为0
*/
private volatile int value;
serialVersionUID
: 순서 ID-unsafe
: 원자 코어 클래스는 클래스는 로우 레벨, 메모리의 동작을 모든 내부 수행된다native
방법valueOffset
: 메모리 오프셋 주소 필드 값value
: 참 값이 1에 해당하는 0이 거짓 나타내고, 사용하는volatile
메모리의 가시성을 보장하기 위해
클래스의 초기화 과정
static {
try {
//返回对象成员属性在内存地址相对于此对象的内存地址的偏移量
valueOffset = unsafe.objectFieldOffset
(AtomicBoolean.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
메인 메모리는 값의 가치가 안전하지 않은 방법에 의해 상쇄 얻을 수 있습니다
회원의 방법
도망()
부울 변수를 가져옵니다
/**
* 返回当前值
*/
public final boolean get() {
return value != 0;
}
부울의 compareAndSet (부울, 부울 업데이 트를 기대합니다)
할당, 할당 오류가 발생하기 전에 상황을 비교 한 후 값이있을 수 있습니다
/*
* 只有当期待的值为expect的时候才会更新相关值
* 1. 期待的值等于现在值,则成功赋值,返回true
* 2. 期待的值不等于现在的值,则赋值失败,则返回false
*/
public final boolean compareAndSet(boolean expect, boolean update) {
int e = expect ? 1 : 0;
int u = update ? 1 : 0;
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
}
- int로 부울 변환
- 하는 전화
compareAndSwapInt
CAS 할당 - 성공을위한 true를 돌려줍니다 거짓 실패를 나타냅니다
boolean getAndSet(boolean newValue)
比较前值后进行赋值,用的相对较多
public final boolean getAndSet(boolean newValue) {
boolean prev;
do {
prev = get();
} while (!compareAndSet(prev, newValue));
return prev;
}
- 先获取之前值
- 在调用循环
compareAndSet
进行CAS赋值
void set(boolean newValue)
无条件设置值,用的相对较少
public final void set(boolean newValue) {
value = newValue ? 1 : 0;
}
void lazySet(boolean newValue)
也是赋值操作,该操作会让Java插入StoreStore内存屏障,避免发生写操作重排序
public final void lazySet(boolean newValue) {
int v = newValue ? 1 : 0;
unsafe.putOrderedInt(this, valueOffset, v);
}
总结
- 该类是原子性
boolean
类,是线程安全的 - 该原子类的核心操作都是基于Unsafe类
- CAS普遍会产ABA问题