자바 병렬 프로 그래 밍 테마(10)---(JUC 원자 류)기본 유형 상세 설명
6120 단어 자바병렬 프로 그래 밍juc원자 류기본 유형
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()
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 원자 류 기본 유형 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.