如何使用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
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
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
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
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
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));