·什么是原子操作?怎么实现原子操作?
synchronized关键字是基于阻塞的锁机制,有几个问题:
1 被阻塞的线程优先级很高怎么办
2 拿到锁的线程一直不释放锁
3 有大量线程竞争怎么办,会消耗CPU,会有死锁或者活锁出现
4 力度太大,如计数器就不需要这么限制
CAS的原理(compare and swap):
指令级别保证这是一个原子操作
三个运算符: 内存地址V,期望值A,一个新值B
如果地址V上的值和期望的值A相等,那么就给地址V赋新值B
如果一直不是期望的值,就在循环(自旋、死循环)里面不断进行CAS,一直到成功为止
CAS会带来三个问题:
ABA问题:A-->B-->A第一次取的时候是A值,第二次放的时候还是A值,以为没有变化实际上变化了(解决方法: 添加版本号)
如果CAS操作长期不成功,cpu不断循环,开销问题
CAS只能保证单个变量的原子操作
·原子操作类的使用
AtomicInteger中包含方法:get()、getAndIncrement()、IncrementAndGet()等
AtomicReference中compareandSet()并不会改变原始对象
AtomicMarkableReference,boolean,只关心又没有人动过(ABA问题解决)
AtomicStampedReference,记录动过几次(ABA问题解决)
·显式锁:
synchronized关键字别名是内置锁,是由java语言特性本身提供的功能,但是所得获取和释放固化了,智能先获取,再释放,Lock接口灵活许多,synchronized在获取锁的过程中是不能够被中断的