CAS
compareAndSet(prev,next);无锁,无阻塞
为什么效率高
失败的话会重新尝试,但是锁会进行上下文切换,代价大
原子整形
AtomicInteger
1 2 3
| incrementAndGet(); getAndAdd(5); updateAndGet(value -> value*10);
|
原子引用
AtomicReference 不能解决ABA问题
AtomicStampedReference 版本号机制
AtomicMarkableReference True和false
原子数组
字段更新器
可以保护类的成员
compareAndSet(obj,expect,update);
原子累加器
和原子整形一样,但是只支持累加并且效率更高
缓存行伪共享
缓存中的数据是按照行分的,要失效就一起失效
有数据a和b,他们被分到了一个行中,线程1改变a导致线程2的行失效,线程2改变b导致线程1的行失效,这就是伪共享
注解sum.misc.Contended , 可以在内存中加入空白,不出现伪共享
longadder
累加单元,和concurrentHashMap一样,使用分段的机制,提高并行度,用一个数组来表示累加,数组元素的和才是真正的累加值,orn
Unsafe
获得Unsafe ,他是单例且private
1 2 3
| Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); Unsafe unsafe = (Unsafe) theUnsafe.get(null);
|
CAS
1 2 3 4
| class Teacher{ volatile int id; volatile String name; }
|
1 2 3 4 5
| long idOffset = unsafe.objectFieldOffset(Teacher.class.getDeclaredField("id")); Teacher t = new Teacher();
unsafe.compareAndSwapInt(t,idOffset,0,1);
|
自己实现AutomicInteger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class MyAtomicInteger{ private volatile int value; private static final long valueOffset; static final Unsafe UNSAFE; static { } public int getValue(){ return value; } public void increment(amount){ while(true){ int prev = this.value; int next = prev+amount; UNSAFE.compareAndSwapInt(this,valueOffset,prev,next); } }
}
|
最后更新时间:
这里可以写作者留言,标签和 hexo 中所有变量及辅助函数等均可调用,示例:
<%- page.permalink.replace(/index\.html$/, '') %>