原子性:如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。
原子性达到的目标:就是能使一个程序被完整的执行。
原子操作:不可被中断的一个或一系列的操作。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
1.处理器如何实现原子操作:
A。使用总线锁保证原子性。(缺点:这样多核处理器的性能降低)
B。通过缓存锁定保证原子性。
2.Java如何实现原子操作:
A。加锁 B。循环的CAS的方式
使用CAS实现原子操作出现的问题:
1)ABA问题
2)时间开销大
3)只能保证一个共享变量的原子操作。
注意:Jvm实现锁的方式都是用了循环CAS(偏向锁除外)
ABA问题
CAS看起来很爽,但是会导致“ABA问题”。
CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。
比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。如果链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。
解救办法:使用AtomicStampedReference来解决,这个类的compareAndSet方法的作用是首先检查当前引用是否等于与其引用,并且检查当前标志是否等于预期标志,全都相等则以原子方式将该引用和该标志的值设置为给定的更新值。
原子性有没有冲突确实没有查到
原子性达到的目标:就是能使一个程序被完整的执行。
原子操作:不可被中断的一个或一系列的操作。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
1.处理器如何实现原子操作:
A。使用总线锁保证原子性。(缺点:这样多核处理器的性能降低)
B。通过缓存锁定保证原子性。
2.Java如何实现原子操作:
A。加锁 B。循环的CAS的方式
使用CAS实现原子操作出现的问题:
1)ABA问题
2)时间开销大
3)只能保证一个共享变量的原子操作。
注意:Jvm实现锁的方式都是用了循环CAS(偏向锁除外)
ABA问题
CAS看起来很爽,但是会导致“ABA问题”。
CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。
比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。如果链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。
解救办法:使用AtomicStampedReference来解决,这个类的compareAndSet方法的作用是首先检查当前引用是否等于与其引用,并且检查当前标志是否等于预期标志,全都相等则以原子方式将该引用和该标志的值设置为给定的更新值。
原子性有没有冲突确实没有查到