Java從JDK1.5開(kāi)始提供了java.util.concurrent.atomic包,其中一共提供了13個(gè)類,屬于4種類型的原子更新方式.分別是原子更新基本類型,原子更新數(shù)組,原子更新引用和原子更新屬性(字段).Atomic包里的類基本都是使用Unsafe實(shí)現(xiàn)的包裝類.
原子更新基本類型:
- AtomicBoolean:布爾類型
- AtomicInteger:整型類型
- AtomicLong:長(zhǎng)整類型
public class AtomicIntegerTest{
static AtomicInteger ai = new AtomicInteger(1);
public void main(){
ai.getAndIncrement();
ai.get();
}
}
原子更新數(shù)組
- AtomicIntegerArray:整型數(shù)組
- AtomicLongArray:長(zhǎng)整型數(shù)組
- AtomicReferenceArray:引用類型數(shù)組
- AtomicIntegerArray 類主要提供原子更新數(shù)組里的整形
public class AtomicIntegerArrayTest{
static int [] value = new int[]{1,2};
static AtomicIntegerArray ai = new AtomicIntegerArray(value);
public void main(){
ai.getAndSet(0,3);
ai.get(0);
value[0];
}
}
//AtomicIntegerArray將數(shù)組復(fù)制一份,所以當(dāng)AtomicIntegerArray對(duì)內(nèi)部數(shù)組元素進(jìn)行修改時(shí),不會(huì)影響傳入的數(shù)組
原子更新引用類型
- AtomicReference:原子更新引用類型
- AtomicReferenceFieldUpdater:原子更新引用類型里的字段
- AtomicMarkableReference:原子更新帶有標(biāo)記位的引用類型
public class AtomicRefenceTest{
public static AtomicReference<User> atomicUserRef = new AtomicRefence<User>();
public void main(){
User user = new User("tom", 12);
atomicUserRef.set(user);
User user1 = new User("cc", 18);
atomicUserRef.compareAndSet(user,user1);
}
}
原子更新字段類
- AtomicIntegerFieldUpdater:原子更新整型的字段更新器
- AtomicLongFieldUpdater:原子更新長(zhǎng)整型的字段更新器
- AtomicStampedReference:原子更新帶有版本號(hào)的引用類型
public class AtomicIntegerFieldUpdaterTest{
private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class,"old");
public void main(){
User conan = new User("conan",12);
a.getAndIncrement(conan);
a.get(conan)
}
}