자바 병렬 프로 그래 밍 테마(10)---(JUC 원자 류)기본 유형 상세 설명

이 절 은 기본 유형 인 AtomicInteger,AtomicLong,AtomicBoolean 을 살 펴 보 겠 습 니 다.AtomicInteger 와 AtomicLong 의 사용 방법 은 차이 가 많 지 않 습 니 다.AtomicBoolean 은 비교적 간단 하기 때문에 방법 이 앞의 두 개 보다 적 습 니 다.그러면 우 리 는 주로 AtomicLong 을 고 르 는데 하 나 를 사용 하고 나머지 는 대동소이 합 니 다.
1.원자 조작 과 일반 조작 의 공통점
우 리 는 원자 조작 전에 왜 이런 원자 류 가 일반적인 기본 데이터 유형 이 아니 라 우리 의 사용 요 구 를 만족 시 킬 수 있 는 지 비교 하기 위해 서 원자 조작 이 다른 곳 을 제시 해 야 한다 고 말 했다.
일반적인 변 수 를 조작 할 때 자바 에서 이 루어 지 는 모든 작업 은 프로그램 컴 파일 시 몇 개의 기계 가 읽 을 수 있 는 명령 으로 변 환 됩 니 다.예 를 들 어 변 수 를 할당 할 때 자바 에 서 는 하나의 명령 만 사 용 했 지만 이 프로그램 을 컴 파일 할 때 이 명령 은 여러 개의 JVM 언어 명령 으로 바 뀌 었 다.이렇게 되면 여러 스 레 드 를 조작 하고 변 수 를 공유 할 때 데이터 가 일치 하지 않 는 오류 가 발생 할 수 있 습 니 다.
자 바 는 이러한 문 제 를 피하 기 위해 원자 변 수 를 도입 했다.하나의 스 레 드 가 원자 변 수 를 조작 하고 있 을 때 다른 스 레 드 에서 도 이 변 수 를 조작 하려 고 합 니 다.클래스 의 실현 에는 그 절차 가 완성 되 었 는 지 확인 하 는 메커니즘 이 포함 되 어 있 습 니 다.기본적으로 변수의 값 을 가 져 오고 로 컬 변수 값 을 바 꾼 다음 이전 값 대신 새 값 을 시도 합 니 다.만약 옛 값 이 여전히 같다 면,그것 을 바 꾸 어 라.만약 다르다 면 방법 은 다시 조작 을 시작한다.이 조작 을 Compare and Set(CAS 라 고 부 르 며 비교 하고 교환 한 다 는 뜻)이 라 고 합 니 다.
원자 변 수 는 값 의 접근 을 보호 하기 위해 자물쇠 나 다른 동기 화 메커니즘 을 사용 하지 않 습 니 다.그들의 모든 조작 은 CAS 조작 에 기초 한 것 이다.이 는 몇 개의 스 레 드 가 원자 대상 을 동시에 조작 할 수 있 고 데이터 가 일치 하지 않 는 오류 가 발생 하지 않 으 며 동기 화 체제 로 보 호 된 정상 변 수 를 사용 하 는 것 보다 성능 이 좋다 는 것 을 보증 합 니 다.
2.AtomicLong 안내
글자 의 의미 에서 우 리 는 AtomicLong 이 원자 방식 으로 갱신 할 수 있 는 long 값 을 알 수 있다.다음은 그의 구조 방법 과 일반적인 방법 을 살 펴 보 자.
구조 방법:
    AtomicLong()                  //초기 값 0 을 가 진 새 AtomicLong 을 만 듭 니 다.
    AtomicLong(long initialValue)/주어진 초기 값 을 가 진 새 AtomicLong 을 만 듭 니 다.
    방법:
     long addAndGet(long delta)   //원자 방식 으로 주어진 값 을 현재 값 에 추가 합 니 다.
     boolean compare AndSet(long expect,long update)/현재 값==예상 값 이면 원자 방식 으로 이 값 을                                                   주어진 업데이트 값 으로 설정 합 니 다.
     long decrementAndGet()       //원자 방식 으로 현재 값 을 1 로 줄이다.
     double doubleValue()         //지정 한 수 치 를 double 형식 으로 되 돌려 줍 니 다.
     float floatValue()           //float 형식 으로 지정 한 수 치 를 되 돌려 줍 니 다.
     long get()                   //현재 값 가 져 오기.
     long getAndAdd(long delta)   //원자 방식 으로 주어진 값 을 현재 값 에 추가 합 니 다.
     long getAndDecrement()       //원자 방식 으로 현재 값 을 1 로 줄이다.
     long getAndIncrement()       //현재 값 을 원자 방식 으로 1 을 추가 합 니 다.
     long getAndSet(long newValue)//원자 방식 으로 주어진 값 으로 설정 하고 이전 값 을 되 돌려 줍 니 다.
     long incrementAndGet()       //현재 값 을 원자 방식 으로 1 을 추가 합 니 다.
     int intValue()               // int 형식 으로 지정 한 수 치 를 되 돌려 줍 니 다.
     void lazySet(long newValue)  //마지막 으로 주어진 값 으로 설정 합 니 다.
     long longValue()             // 지정 한 수 치 를 log 형식 으로 되 돌려 줍 니 다.
     void set(long newValue)      //주어진 값 으로 설정 합 니 다.
     String toString()            // 현재 값 의 문자열 표시 형식 을 되 돌려 줍 니 다.
     boolean weakCompareAndSet(long expect,long update)/현재 값==예상 값 이면 원자 방식 으로 이 값 을 주어진 업데이트 값 으로 설정 합 니 다.
3.AtomicLong 사용
3.1   AtomicLong 만 들 기
AtomicLong 을 만 드 는 과정 은 다음 과 같 습 니 다.

AtomicLong atomicLong = new AtomicLong();
이 예제 에 서 는 초기 값 이 0 인 AtomicLong 을 만 듭 니 다.
초기 값 을 가 진 AtomicLong 을 만 들 려 면 다음 과 같이 할 수 있 습 니 다.

 AtomicLong atomicLong = new AtomicLong(123);
이 예제 에 서 는 값 123 을 매개 변수 로 AtomicLong 제본기 에 전달 합 니 다.이 장 치 는 AtomicLong 인 스 턴 스 의 초기 값 을 123 으로 설정 합 니 다.
3.2   AtomicLong 값 가 져 오기
get()방법 get()AtomicLong 인 스 턴 스 의 값 을 사용 할 수 있 습 니 다.여 기 는 AtomicLong.get()예제 입 니 다.

AtomicLong atomicLong = new AtomicLong(123);

long theValue = atomicLong.get();
AtomicLong 값 설정
set()방법 set()AtomicLong 인 스 턴 스 의 값 을 사용 할 수 있 습 니 다.여 기 는 Atomic Long.set()예제 입 니 다.

  AtomicLong atomicLong = new AtomicLong(123);

  atomicLong.set(234);
이 예제 에 서 는 초기 값 이 123 인 AtomicLong 예제 를 만 든 다음 줄 에서 값 을 234 로 설정 합 니 다.
3.3   AtomicLong 값 비교 및 설정
AtomicLong 류 에 도 원자 compare AndSet()방법 이 있다.이 방법 은 AtomicLong 인 스 턴 스 의 현재 값 을 AtomicLong 과 비교 합 니 다.이 두 값 이 같 으 면 AtomicLong 인 스 턴 스 는 새 값 을 설정 합 니 다.여 기 는 AtomicLong.com pareAndSet()예제 입 니 다.

  AtomicLong atomicLong = new AtomicLong(123);
  long expectedValue = 123;
  long newValue = 234;
  atomicLong.compareAndSet(expectedValue,newValue);
이 예제 에 서 는 우선 123 의 AtomicLong 인 스 턴 스 를 만 듭 니 다.그 다음 에 이 는 AtomicLong 의 값 을 기대 치 123 과 비교 하고 이들 이 같 으 면 AtomicLong 의 새로운 값 을 234 로 바 꿉 니 다.
3.4   AtomicLong 값 에 추가
AtomicLong 류 는 몇 가지 방법 을 포함 하고 있 습 니 다.이 방법 을 사용 하여 AtomicLong 에 값 을 추가 하고 그 값 을 되 돌려 줄 수 있 습 니 다.이 몇 가지 방법 이 우리 가 잘못 사용 하면 나 쁜 의 미 를 가 져 올 수 있 기 때문에 우 리 는 중점 을 두 어야 한다.이 방법 들 은:
    addAndGet()
    getAndAdd()
    getAndIncrement()
    incrementAndGet()
  • 첫 번 째 방법 은 addAndGet()이 AtomicLong 에 숫자 를 추가 하고 추가 한 후에 그 값 을 되 돌려 줍 니 다.
  • 두 번 째 방법 getAndAdd()는 AtomicLong 에 숫자 를 추가 하지만 AtomicLong 이 값 을 추가 하기 전의 값 을 되 돌려 줍 니 다.
  • 이 두 가지 방법 중 어느 것 을 사용 해 야 하 는 지 는 당신 의 용례 에 달 려 있 습 니 다.여기에 두 가지 예 가 있다.
    
     AtomicLong atomicLong = new AtomicLong();
     System.out.println(atomicLong.getAndAdd(10));
     System.out.println(atomicLong.addAndGet(10));
    이 예 는 0 과 20 값 을 출력 합 니 다.우선,예 시 는 10 을 추가 하기 전에 AtomicLong 의 값 을 가 져 옵 니 다.그것 의 값 은 덧셈 하기 전에 0 입 니 다.그리고 예 시 는 10 을 AtomicLong 에 추가 하고 추 가 된 값 을 가 져 옵 니 다.이 값 은 현재 20 이다.
    이 두 가지 방법 을 통 해 AtomicLong 에 음 수 를 추가 할 수 있 습 니 다.결 과 는 사실상 감법 이다.
    방법 getAndIncrement()와 increment AndGet()의 작업 원 리 는 getAndAdd()와 addAndGet()과 같 지만 AtomicLong 에 1 만 추가 하 는 값 입 니 다.
    3.5   AtomicLong 값 에서 빼 기
    AtomicLong 류 는 AtomicLong 값 에서 AtomicLong 값 으로 사용 하 는 방법 도 포함 되 어 있다.이 방법 들 은:
      decrementAndGet()
      getAndDecrement()
    decrement AndGet()은 AtomicLong 값 에서 1 을 빼 고 AtomicLong 에서 값 을 되 돌려 줍 니 다.getAndDecrement()도 AtomicLong 값 에서 1 을 빼 지만 AtomicLong 이 AtomicLong 이전 값 으로 되 돌아 갑 니 다.
    위 에서 우 리 는 AtomicLong 의 용법 을 대체적으로 알 게 되 었 다.AtomicBoolean,AtomicInteger 도 그것 의 용법 과 차이 가 많 지 않다.우 리 는 API 각자 의 방법 을 보면 어떻게 사용 해 야 하 는 지 알 수 있다.
    이상 은 자바 병렬 프로 그래 밍 주제(10)-(JUC 원자 류)기본 유형 에 대한 상세 한 내용 입 니 다.자바 jc 원자 류 기본 유형 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기