원자 조작 류 소개

원자 조작 류 소개
자바 의 다 중 스 레 드 때문에 여러 스 레 드 가 같은 변 수 를 동시에 수정 하면 마지막 변 수 는 예상 한 결 과 를 얻 지 못 합 니 다.이 유 는 다 중 스 레 드 작업 으로 인해 변수 작업 에 원자 성 이 부족 하기 때문에 변수 가 다 중 스 레 드 작업 에서 기대 하 는 효 과 를 얻 지 못 하기 때문이다.
다음 사례 에서 보 듯 이:
public class Test {

    private static int count = 10;
    private static AtomicInteger atomicCount = new AtomicInteger(10);
    private static final ExecutorService executorService = Executors.newFixedThreadPool(4);

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    atomicExecute();
//                    unAtomicExecute();
                }
            });
        }
    }

    private static void unAtomicExecute() {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.print(--count+" ");
    }

    private static void atomicExecute() {
        try {
            Thread.sleep(50);//       
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.print( atomicCount.decrementAndGet()+" ");
    }
}


unAtomicExecute()        :9 9 8 9 7 5 4 6 3 2 

atomicExecute()        :9 6 8 7 5 2 4 3 1 0 

        ,unAtomicExecute()       ,                 。atomicExecute()    AtomicInteger       。
Java 에서 JDK1.5 에서 java.util.concurrent.atomic 팩 (Atomic 팩 으로 약칭) 을 제공 했다. 이 가방 의 원자 조작 류 는 용법 이 간단 하고 성능 이 효율 적 이 며 스 레 드 가 안전하게 변 수 를 업데이트 하 는 방식 을 제공 했다.Atomic 가방 에 4 가지 유형의 원자 류 를 제공 합 니 다.
  • 원자 업데이트 기본 유형
    AtomicBoolean:        
    
    AtomicInteger:      
    
    AtomicLong:       
    AtomicBoolean, AtomicIntegerAtomicLong 의 실현 은 비슷 하 다. 여기 서 AtomicInteger 상용 API 를 통 해 소개 한다.
  • AtomicInteger 의 구조
    public AtomicInteger(int var1) {//      
        this.value = var1;
    }
    
    public AtomicInteger() {//     
    }
  • 상용 방법
    public final int get() {//     
        return this.value;
    }
    
    public final void set(int var1) {//   
        this.value = var1;
    }
    
    public final int getAndIncrement() {//          1
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }
    
    public final int getAndDecrement() {////           1
        return unsafe.getAndAddInt(this, valueOffset, -1);
    }
    
    public final int getAndAdd(int var1) {//                
        return unsafe.getAndAddInt(this, valueOffset, var1);
    }
    
    public final int incrementAndGet() {//   1,      
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }
    
    public final int decrementAndGet() {//   1,      
        return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
    }
    
    public final int addAndGet(int var1) {//         ,      
        return unsafe.getAndAddInt(this, valueOffset, var1) + var1;
    }
    
  • 원자 업데이트 배열
    AtomicIntegerArray:            
    
    AtomicLongArray:             。
    
    AtomicReferenceArray:              
    은 자바 에서 사용 하기 좋 은 병발 방지 용 기 를 많이 제공 하기 때문에 위 에서 언급 한 것 은 일반적으로 자주 사용 되 지 않 습 니 다.
  • 원자 업 데 이 트 는
    AtomicReference:        
    
    AtomicReferenceFieldUpdater:            
    
    AtomicMarkableReference:              
    이라는 세 가지 유형의 실현 방법 을 기본적으로 인용 하 였 으 며, 여 기 는 AtomicReference 로 예 를 들 어 보 겠 습 니 다.
    public class AtomicReferenceTest {       
    
        public static AtomicReference atomicUserRef = new AtomicReference();   
    
        public static void main(String[] args) {         
            User user = new User("lisi", 16);
            atomicUserRef.set(user);
            System.out.println(atomicUserRef.get().getName() + "  " + atomicUserRef.get().getOld());
    
            System.out.println("-------------------------");
    
            User updateUser = new User("zhangsan", 18);
            atomicUserRef.compareAndSet(user, updateUser);
            System.out.println(atomicUserRef.get().getName() + "  " + atomicUserRef.get().getOld());      
        }        
    
        static class User {      
            private String name;                
            private int old;     
    
            public User(String name, int old) {            
                this.name = name;                        
                this.old = old;               
            }                
            public String getName() {
                return name;                
            }                
            public int getOld() {                        
                return old;
            }        
        } 
    }
    
    
        :
    
    
    lisi  16
    -------------------------
    
    zhangsan  18
  • 원자 업데이트 속성
    AtomicIntegerFieldUpdater:             
    
    AtomicLongFieldUpdater:             
    
    AtomicStampedReference:              
    등 몇 가지 유형 은 사용 하 는 것 이 비교적 적 고 사용 방법 은 위의 것 과 유사 하 며 유형 도 복잡 하지 않 으 며 관심 이 있 으 면 소스 코드 를 알 수 있 으 며 여 기 는 예 를 쓰 지 않 습 니 다.
  • 좋은 웹페이지 즐겨찾기