《Java 병렬 프로그래밍 실전》 독서노트 - 동기화 방법, 원자류, Unsafe류와 CAS

2570 단어 Java 동시 실행
1. 동기화 방법
(1) 스레드 간에 이 상태 변수를 공유하지 않는다(예를 들어 ThreadLocal).
(2) 상태 변수를 변하지 않는 변수로 수정(final,final 변수에 가변 변수가 있으면 변하지 않는 변수가 아니다).
(3) 상태 변수에 접근할 때 동기화(synchronized)를 사용하고 패키지를 보내는 여러 종류, 예를 들어ReentrantLock,CountDownLatch 등).
2. 원자류, CAS 자전거+volatile 변수로 실현
public class AtomicInteger extends Number implements java.io.Serializable {

	//    unsafe  CAS  
	private static final Unsafe unsafe = Unsafe.getUnsafe();

	//        ,       ,    
	private static final long valueOffset;
        //     
	private volatile int value;

	public final boolean compareAndSet(int expect, int update) {
		return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
	}

	// incrementAndGet()      ++value;getAndIncrement()      value++
	public final int incrementAndGet() {
		return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
	}
}

이상은 1.8 원본이고 구 버전의 원본은 좀 더 뚜렷하다. 아래와 같이 CAS자선+volatile로incrementAndGet()을 실현한 것을 똑똑히 볼 수 있다.compareAndSet(current,next)은value가current와 같은지 확인하고,value=next는true로 되돌아오고,그렇지 않으면false로 돌아갑니다.
public final int incrementAndGet() {
	for(;;) {
		//     value
		int current = get();
		int next = current + 1;
		if(compareAndSet(current, next))
			return next;
	}
}

3. Unsafe 클래스는 메모리(Native 방법이기 때문에 unsafe의)에 직접 접근할 수 있고 하드웨어 수준의 원자 조작을 제공한다.다음과 같은 몇 가지 기능이 있습니다.
(1) 메모리를 분배하고 방출할 수 있다.
3개의 Native 방법인 allocateMemory(), reallocateMemory(), freeMemory()는 각각 메모리를 분배, 확장, 방출하는 데 사용된다.
(2) 대상의 특정한 필드의 메모리 위치를 정할 수도 있고 대상의 필드 값을 수정할 수도 있다. 설령 그것이 개인적이라고 해도.
(3) 라인의 마운트와 회복;
한 라인을 마운트하는 것은 Park () 방법을 통해 이루어지며, Park () 를 호출한 후, 라인은 시간 초과나 중단 조건이 나타나는 것을 알기 때문에 계속 막힙니다.unpark () 는 마운트된 라인을 중지하고 정상적으로 복구할 수 있습니다.모든 패키지가 라인에 대한 마운트와 복구 작업을locks에 봉인합니다.LockSupport 클래스에서 LockSupport 클래스에는 다양한 버전 패키지 () 방법이 있으며, 최종적으로 Unsafe가 호출되었습니다.park().
(4) CAS 작업에는 compareAndSwapXXX 방법이 있습니다.
public native boolean compareAndSwapInt(Object obj, long offset, int expect, int update);

4、CAS
CAS 알고리즘은 하드웨어가 직접 지원하여 원자성을 확보하는 것으로 메모리 값 V, 예비 평가 A와 업데이트 값 B가 있고if(V=A)V=B가 있다.그렇지 않으면 아무것도 하지 않고 낙관적인 자물쇠에 많이 쓰이며 ABA문제가 있으면 버전 번호나 시간 스탬프를 추가해서 해결할 수 있다.자바에서는 ABA 문제를 해결하기 위해 Atomic Stamped Reference와 Atomic Markable Reference를 제공합니다.
Atomic Stamped Reference를 예로 들면, 우리는 실제 대상 인용과 시간 스탬프를 유지하기 위해 Stamped Reference 클래스를 만들 수 있습니다. 이 Stamped Reference는 변하지 않는 대상이어야 합니다. (그렇지 않으면 CAS에서 메모리 값과 예비 평가는 항상 같은 대상을 가리킵니다.)CAS의 경우 메모리 값 V=사전 평가 B(즉 StampedReference의 인용 대상이 같음)에서 원래의 StampedReference 클래스를 대체하는 StampedReference 클래스를 새로 만듭니다.

좋은 웹페이지 즐겨찾기