원자 조작 류 소개
11149 단어 자바 병렬 프로 그래 밍
자바 의 다 중 스 레 드 때문에 여러 스 레 드 가 같은 변 수 를 동시에 수정 하면 마지막 변 수 는 예상 한 결 과 를 얻 지 못 합 니 다.이 유 는 다 중 스 레 드 작업 으로 인해 변수 작업 에 원자 성 이 부족 하기 때문에 변수 가 다 중 스 레 드 작업 에서 기대 하 는 효 과 를 얻 지 못 하기 때문이다.
다음 사례 에서 보 듯 이:
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, AtomicInteger 과 AtomicLong 의 실현 은 비슷 하 다. 여기 서 AtomicInteger 상용 API 를 통 해 소개 한다.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: 등 몇 가지 유형 은 사용 하 는 것 이 비교적 적 고 사용 방법 은 위의 것 과 유사 하 며 유형 도 복잡 하지 않 으 며 관심 이 있 으 면 소스 코드 를 알 수 있 으 며 여 기 는 예 를 쓰 지 않 습 니 다.