[자바 병발]원자 성 조작 류 의 사용
유형
Integer
Long
기본 유형
AtomicInteger
AtomicLong
AtomicBoolean
배열 형식
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
속성 원자 수정 기
AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater
1.기본 유형의 사용
먼저 AtomicInteger 의 사용 을 살 펴 보 겠 습 니 다.AtomicInteger 는 주로 정수 에 대한 수정 입 니 다.예제 코드 를 보 세 요.
public class AtomicIntegerDemo {
/** * * @see AtomicInteger#get() * @see AtomicInteger#getAndAdd(int) , * @see AtomicInteger#getAndDecrement() 1, * @see AtomicInteger#getAndIncrement() 1, * @see AtomicInteger#getAndSet(int) , * * @see AtomicInteger#addAndGet(int) * @see AtomicInteger#decrementAndGet() 1, * @see AtomicInteger#incrementAndGet() 1, * @see AtomicInteger#lazySet(int) get set * * @see AtomicInteger#compareAndSet(int, int) , true false */
public final static AtomicInteger TEST_INTEGER = new AtomicInteger(1);
public static void main(String []args) {
for(int i = 0 ; i < 10 ; i++) { // 10
new Thread() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int now = TEST_INTEGER.incrementAndGet(); //
System.out.println(Thread.currentThread().getName() + " get value : " + now);
}
}.start();
}
}
}
결 과 를 살 펴 보 자.
Thread-3 get value : 4 Thread-7 get value : 5 Thread-9 get value : 9 Thread-4 get value : 6 Thread-0 get value : 3 Thread-1 get value : 8 Thread-5 get value : 11 Thread-8 get value : 7 Thread-2 get value : 10 Thread-6 get value : 2
10 개의 스 레 드 사 이 는 스 레 드 가 안전 하고 충돌 이 없 음 을 알 수 있다.즉,우 리 는 원자 조작 류 를 사용 하여 기본 유형 int 를 조작 하면 스 레 드 안전 문 제 를 해결 할 수 있 고 한 스 레 드 가 조작 할 때 다른 스 레 드 를 배척 할 수 있 으 며 우리 가 수 동 으로 synchronized 를 사용 하지 않 아 도 상호 배척 작업 을 실현 할 수 있다.AtomicLong 은 AtomicBoolean 과 유사 하 므 로 예 를 들 지 않 습 니 다.
2.배열 형식의 사용
다음은 Atomic 의 배열 용법,Atomic 의 배열 은 길 이 를 수정 하 는 것 을 허락 하지 않 는 다 는 등 집합 류 처럼 풍부 한 조작 을 하지 않 지만 배열 에 있 는 모든 요소 의 조작 을 절대적 으로 안전 하 게 할 수 있다.즉,세분 화 된 힘 은 배열 에 있 는 요소 로 2 차 포장 을 했다.배열 유형 이지 만 마지막 으로 배열 에 저 장 된 수 를 조작 할 수 있다.그래서 위의 기본 유형 을 알 게 되면 배열 유형 도 이해 하기 쉽다.Atomic IntegerArray 의 사용 을 살 펴 보 겠 습 니 다.다른 것 은 유사 합 니 다.
public class AtomicIntegerArrayTest {
/** * * @see AtomicIntegerArray#addAndGet(int, int) , , , * @see AtomicIntegerArray#compareAndSet(int, int, int) , 1: , 2: , 3, , true false * @see AtomicIntegerArray#decrementAndGet(int) , 1, * @see AtomicIntegerArray#incrementAndGet(int) , 1, * * @see AtomicIntegerArray#getAndAdd(int, int) addAndGet , * @see AtomicIntegerArray#getAndDecrement(int) decrementAndGet , * @see AtomicIntegerArray#getAndIncrement(int) incrementAndGet , * @see AtomicIntegerArray#getAndSet(int, int) , , */
private final static AtomicIntegerArray ATOMIC_INTEGER_ARRAY = new AtomicIntegerArray(new int[]{1,2,3,4,5,6,7,8,9,10});
public static void main(String []args) throws InterruptedException {
Thread []threads = new Thread[10];
for(int i = 0 ; i < 10 ; i++) {
final int index = i;
final int threadNum = i;
threads[i] = new Thread() {
public void run() {
int result = ATOMIC_INTEGER_ARRAY.addAndGet(index, index + 1);
System.out.println(" :" + threadNum + " , :" + (index + 1) + ", :" + result);
}
};
threads[i].start();
}
for(Thread thread : threads) {
thread.join();
}
System.out.println("=========================>
, :");
for(int i = 0 ; i < ATOMIC_INTEGER_ARRAY.length() ; i++) {
System.out.println(ATOMIC_INTEGER_ARRAY.get(i));
}
}
}
실행 결 과 는 각 배열 요소 에 같은 값 을 더 하 는 것 으로 서로 영향 을 주지 않 습 니 다.
3.클래스 속성 으로 사용
특정한 데이터 형식 이 특정한 클래스 의 속성 일 때 우 리 는 이 데 이 터 를 조작 하려 면 속성 원자 수정 기 를 사용 해 야 합 니 다.여 기 는 Integer 를 예 로 들 면 Atomic Integer FieldUpdater 입 니 다.예제 코드 는 다음 과 같다.
public class AtomicIntegerFieldUpdaterTest {
static class A {
volatile int intValue = 100;
}
/** * , * : , private default protected * static ( ), final ( ), * * ( AtomicInteger , ) * @see AtomicIntegerFieldUpdater#addAndGet(Object, int) * @see AtomicIntegerFieldUpdater#compareAndSet(Object, int, int) * @see AtomicIntegerFieldUpdater#decrementAndGet(Object) * @see AtomicIntegerFieldUpdater#incrementAndGet(Object) * * @see AtomicIntegerFieldUpdater#getAndAdd(Object, int) * @see AtomicIntegerFieldUpdater#getAndDecrement(Object) * @see AtomicIntegerFieldUpdater#getAndIncrement(Object) * @see AtomicIntegerFieldUpdater#getAndSet(Object, int) */
public final static AtomicIntegerFieldUpdater<A> ATOMIC_INTEGER_UPDATER = AtomicIntegerFieldUpdater.newUpdater(A.class, "intValue");
public static void main(String []args) {
final A a = new A();
for(int i = 0 ; i < 10 ; i++) {
new Thread() {
public void run() {
if(ATOMIC_INTEGER_UPDATER.compareAndSet(a, 100, 120)) {
System.out.println(Thread.currentThread().getName() + " !");
}
}
}.start();
}
}
}
이 를 통 해 알 수 있 듯 이 클래스 와 클래스 속성 을 전달 해 야 합 니 다.전달 한 후에 앞에서 조작 한 Integer 와 다 를 것 이 없습니다.본질 이 똑 같 습 니 다.실행 해 보 세 요.결 과 는 하나의 스 레 드 만 이 이 를 수정 할 수 있 습 니 다.스 레 드 의 원자 조작 류 의 사용 은 간단하게 정리 할 수 있 습 니 다.다른 조작 류 의 원 리 는 모두 비슷 합 니 다.JDK 의 문 서 를 참고 하면 해당 하 는 테스트 코드 를 쉽게 쓸 수 있 습 니 다.관련 읽 기:http://blog.csdn.net/column/details/bingfa.html
--나 누 기 를 좋아 하고,함께 진보 하 라!-더 많은 글 을 보십시오.http://blog.csdn.net/eson_15
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.