如何使用Unsafe

CAS操作

不通过new,不通过反射创建对象的实例

内存分配

线程的锁操作

引出Unsafe

如果你要问我JUC包下的 AtomicInteger,AtomicLong,AtomicReference这些类是如何在并发的环境下保持原子性的,我会不假思索的回答,CAS。

以下是AtomicInteger中的一些简单常用的方法。

1 AtomicInteger ai = new AtomicInteger(9);
2 System.out.println(ai.getAndSet(8));//9
3 System.out.println(ai.getAndSet(32));//8
4 System.out.println(ai.get());//32
View Code

 AtomicInteger设置初始值为9,getAndSet(i)覆盖AtomicInteger的值为i,并返回旧值。get()获取当前值。

1 AtomicInteger ai = new AtomicInteger(14);
2 System.out.println(ai.getAndAdd(2));//14
3 System.out.println(ai.addAndGet(5));//21
4 System.out.println(ai.get());//21
View Code

getAndAdd(i)在原有的值上增加i,并返回旧值。addAndGet(i),在原有的值上增加i,并返回增加后的值。

1 AtomicInteger ai = new AtomicInteger(14);
2 System.out.println(ai.getAndIncrement());// 14
3 System.out.println(ai.incrementAndGet());// 16
4 System.out.println(ai.get());// 16
View Code

getAndIncrement()原有的值自增1,并返回旧的值。incrementAndGet(i)原有的值自增1,并返回自增后的值。

AtomicInteger ai = new AtomicInteger(14);
System.out.println(ai.getAndDecrement());// 14
System.out.println(ai.decrementAndGet());// 12
System.out.println(ai.get());// 12
View Code

getAndDecrement()原有的值自减1,然后返回旧的值。decrementAndGet()原有的值自减1,然后返回新的值。

1 AtomicInteger ai = new AtomicInteger(14);
2 System.out.println(ai.compareAndSet(14, 16));// true
3 System.out.println(ai.compareAndSet(14, 18));// false
4 System.out.println(ai.get());// 16
View Code

compareAndSet(x,y)如果原值为x,则替换为y,返回true或者false。

 1 AtomicInteger ai = new AtomicInteger(14);
 2 
 3 System.out.println(ai.getAndSet(8));// getAndSetInt
 4 
 5 System.out.println(ai.getAndAdd(2));// getAndAddInt
 6 System.out.println(ai.addAndGet(5));// getAndAddInt
 7 
 8 System.out.println(ai.getAndIncrement());// getAndAddInt
 9 System.out.println(ai.incrementAndGet());// getAndAddInt
10 
11 System.out.println(ai.getAndDecrement());// getAndAddInt
12 System.out.println(ai.decrementAndGet());// getAndAddInt
13 
14 // compareAndSwapInt
15 System.out.println(ai.compareAndSet(14, 16));
View Code

相关文章: