JavaTM Platform
Standard Ed. 6

패키지 java.util.concurrent.atomic

단일의 변수에 대한 락 프리로 thread 세이프인 프로그래밍을 지원하는 클래스의 소규모의 툴 킷입니다.

참조처:
          설명

클래스의 개요
AtomicBoolean 원자적인 갱신이 가능한 boolean 치입니다.
AtomicInteger 원자적인 갱신이 가능한 int 치입니다.
AtomicIntegerArray 요소의 원자적인 갱신이 가능한 int 배열입니다.
AtomicIntegerFieldUpdater<T> 지정된 클래스의 지정된 volatile int 필드의 원자 갱신이 가능한, 리플렉션 베이스의 유틸리티입니다.
AtomicLong 원자적인 갱신이 가능한 long 치입니다.
AtomicLongArray 요소의 원자적인 갱신이 가능한 long 배열입니다.
AtomicLongFieldUpdater<T> 지정된 클래스의 지정된 volatile long 필드의 원자 갱신이 가능한, 리플렉션 베이스의 유틸리티입니다.
AtomicMarkableReference<V> AtomicMarkableReference 는, 원자적으로 갱신 가능한 마크 비트와 함께, 객체 참조를 관리합니다.
AtomicReference<V> 원자적인 갱신이 가능한 객체 참조입니다.
AtomicReferenceArray<E> 요소를 원자적으로 갱신 가능한 객체 참조의 배열입니다.
AtomicReferenceFieldUpdater<T, V> 지정된 클래스의 지정된 volatile 참조 필드의 원자 갱신이 가능한, 리플렉션 베이스의 유틸리티입니다.
AtomicStampedReference<V> AtomicStampedReference 는, 원자적으로 갱신 가능한 정수 「스탬프」와(과) 함께, 객체 참조를 관리합니다.
 

패키지 java.util.concurrent.atomic 의 설명

단일의 변수에 대한 락 프리로 thread 세이프인 프로그래밍을 지원하는 클래스의 소규모의 툴 킷입니다. 기본적으로, 이 패키지내의 클래스는 volatile 치, 필드, 및 배열 요소의 개념을, 원자적인 조건부 갱신 조작도 제공하는 클래스에까지 확장합니다. 서식은 다음과 같습니다.

boolean compareAndSet(expectedValue, updateValue);

이 메소드 (클래스가 다르면(자) 인수의 형태도 다르다)가 expectedValue 를 현재 보관 유지하고 있는 경우, 변수를 updateValue 에 원자적으로 설정해, 성공하면(자) true 를 돌려줍니다. 이 패키지내의 클래스에는, 값을 취득하거나 무조건으로 설정하는 메소드, 및 이하로 설명하는 약한 조건부 원자 갱신 조작 weakCompareAndSet 도 포함됩니다.

이러한 메소드 스펙에 근거하는 구현에 의해, 최신의 프로세서로 사용 가능한 고효율의 머신 레벨 원자 명령을 사용하는 것이 가능하게 됩니다. 다만, 일부의 플랫폼에서는, 이것을 지원하는 것으로, 하등의 내부 락이 수반할 가능성이 있습니다. 이 때문에, 메소드로 비블로킹이 엄밀하게 보증되는 것은 아닙니다. thread는, 조작을 실행하기 전에 일시적으로 블록을 실행하는 일이 있습니다.

AtomicBoolean ,AtomicInteger ,AtomicLong , 및 AtomicReference 클래스의 인스턴스는, 각각 대응하는 형태의 단일의 변수에 액세스 및 갱신을 제공합니다. 각 클래스는, 그 형태에 대응한 유틸리티 메소드도 제공합니다. 예를 들어,AtomicLongAtomicInteger 클래스는, 원자 증분 메소드를 제공합니다. 어느 어플리케이션이, 다음과 같이 일련 번호를 생성한다고 합니다.

class Sequencer {
private final AtomicLong sequenceNumber
= new AtomicLong(0);
public long next() {
return sequenceNumber.getAndIncrement();
  }
}

일반적으로, 원자 액세스 및 원자 갱신의 메모리 효과는,「Java 언어 스펙 제 3 판 (17.4 메모리 모델)」의 휘발성 규칙에 따릅니다.

이 패키지에는, 단일의 값을 나타내는 클래스에 가세해 선택한 클래스내의 선택한 volatile 필드에 대한 compareAndSet 조작의 취득에 사용 가능한 Updater 클래스가 포함됩니다. AtomicReferenceFieldUpdater ,AtomicIntegerFieldUpdater , 및 AtomicLongFieldUpdater 는, 관련하는 필드형에의 액세스를 제공하는 리플렉션 베이스의 유틸리티입니다. 이것들은 주로, 동일 노드의 복수의 volatile 필드 (트리 노드의 링크등)가 독립해 원자 갱신의 대상이 되는 원자 데이터 구조로 사용됩니다. 이러한 클래스를 사용하면(자), 원자 갱신의 사용 방법 및 사용하는 타이밍에 관한 유연성이 높아집니다. 다만, 리플렉션 베이스의 설정이 취급하기 어려운, 사용하기 어려운, 보증이 약해지는 등의 희생을 지불할 필요가 있습니다.

AtomicIntegerArray ,AtomicLongArray , 및 AtomicReferenceArray 클래스는, 이러한 형태의 배열에 대한 원자 조작 지원를 한층 더 확장합니다. 이러한 클래스는, 일반의 배열에서는 지원되지 않는, 배열 요소에 대한 volatile 액세스 시멘틱스를 제공하는 점에서도 주목할 만합니다.

원자 클래스는, 적용성이 제한되고 있는 weakCompareAndSet 메소드도 지원합니다. 플랫폼에 따라서는, 일반적으로의 사용에서는 약한 버젼 쪽이 compareAndSet 보다 효과적인 경우가 있습니다만, 지정된 weakCompareAndSet 메소드 호출이 외관상에서도 (즉, 명확한 이유없이) false 를 돌려주는 일이 있는 점이 다릅니다. false 가 의미하는 것은, 필요에 따라서 조작을 재시행할 수 있는 것 뿐입니다. 이것은, 변수가 expectedValue 를 보관 유지해, 이 변수의 설정을 시도하는 것 외의 thread가 존재하지 않는 경우에, 호출을 반복해 실행하는 것으로 최종적인 성공이 보증되는 것에 기초를 두고 있습니다. 그러한 외관상의 실패는, 예상되는 값과 현재의 값이 동일한지 어떤지 (와)는 관계가 없는, 메모리 경합 효과가 원인의 경우가 있습니다. 또,weakCompareAndSet 는, 일반적으로은 동기 제어용으로 필요한 순서부의 보증을 제공하지 않습니다. 다만, 이 메소드는, 그러한 갱신이 프로그램의 그 외의 happens-before 의 순서부에 관계없는 경우는, 카운터와 통계 정보를 갱신할 때에 편리합니다. thread로 weakCompareAndSet 에 의한 원자 변수에의 갱신이 인식되었을 때,weakCompareAndSet 의 전에 발생한 것 외의 변수에의 갱신도 인식된다고는 할 수 없습니다. 이것은, 퍼포먼스 통계 데이터를 갱신하는 경우 등은 용인할 수 있는 일도 있습니다만, 대부분은 그렇지는 않습니다.

AtomicMarkableReference 클래스는, 단일의 boolean 치를 참조와 관련짓습니다. 예를 들어, 데이터 구조의 내부에서 이 비트를 사용해, 참조중의 객체가 논리적으로 삭제가 끝난 상태인 것을 나타낼 수 있습니다. AtomicStampedReference 클래스는, 정수치를 참조에 관련짓습니다. 이것은, 일련의 갱신에 대응하는 버젼 번호를 나타내는 경우 등에 사용할 수 있습니다.

원자 클래스는, 비블록 데이터 구조 및 관련하는 기반 클래스를 구현하기 위한 기본 단위로서 주로 설계되고 있습니다. 일반적으로,compareAndSet 메소드는 락의 대체가 아닙니다. 이것은, 객체의 위기인 갱신이 「단일의」변수로 한정되는 경우에만 적용됩니다.

원자 클래스는,java.lang.Integer 및 관련 클래스에 대한 범용의 대체 클래스가 아닙니다. 이 클래스는,hashCodecompareTo 등의 메소드를 정의하지 않습니다 (원자 변수에서는 변경이 상정되고 있기 (위해)때문에, 해시 테이블 키로서는 바람직한 선택사항은 아니기 때문에). 또, 클래스는 목적의 어플리케이션으로 공통되어 유용한 형태에 대해서 제공됩니다. 예를 들어,byte 를 나타내는 원자 클래스는 존재하지 않습니다. 이러한 사용 빈도의 적은 케이스에서는,AtomicInteger 를 사용해 byte 치를 보관 유지해, 필요에 따라서 캐스트 할 수 있습니다. 또,Float.floatToIntBitsFloat.intBitstoFloat 변환을 사용해 float 를 보관 유지하거나Double.doubleToLongBitsDouble.longBitsToDouble 변환을 사용해 double 를 보관 유지하거나 할 수 있습니다.

도입된 버젼:
1.5

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.