[자바 병발]원자 성 조작 류 의 사용

자바 5 이후 에 우 리 는 스 레 드 원자 성 조작 을 접 하 게 되 었 습 니 다.즉,수정 할 때 우 리 는 그 순간 이 안전 하 다 는 것 만 확보 하면 됩 니 다.해당 하 는 포장 을 거 친 후에 대상 의 병발 수정 을 처리 할 수 있 습 니 다.본 고 는 Atomic 시리즈 의 사용 방법 을 정리 하고 자 합 니 다.그 중에서 다음 과 같 습 니 다.
유형
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

좋은 웹페이지 즐겨찾기