总结:Java随笔
一、乐观锁
悲观锁:指的就是我们平常使用的加锁机制,它假设我们总是处于最坏的情况下,如果不加锁数据完整性就会被破坏。
乐观锁:指的是一种基于冲突检测的方法,检测到冲突时操作就会失败。
悲观锁在java中很常见,最典型的就是 synchronized
;
那么乐观锁的应用有哪些呢?
CAS
CAS(Compare And Swap)是一种常见的“乐观锁”,也叫自旋锁,大部分的CPU都有对应的汇编指令,它有三个操作数:内存地址V,旧值A,新值B。只有当前内存地址V上的值是A,B才会被写到V上,否则操作失败。
public class SimulatedCAS {
private int value;
public synchronized int get() { return value; }
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue)
value = newValue;
return oldValue;
}
}
上边的类模拟了CAS操作,如果成员变量 value 的值与参数 expecredValue 的值不同,那就说明其他的线程已对其进行了修改,本次操作失败。
Java从5.0开始引入了对CAS的支持,与之对应的是 java.util.concurrent.atomic 包下的AtomicInteger、AtomicReference等类,它们提供了基于CAS的读写操作和并发环境下的内存可见性。
二、CopyOnWriteArrayList
介绍
从 CopyOnWriteArrayList 的名字就能看出它是满足 CopyOnWrite 的 ArrayList,CopyOnWrite 的意思是说,当容器需要被修改的时候,不直接修改当前容器,而是先将当前容器进行 Copy,复制出一个新的容器,然后修改新的容器,完成修改之后,再将原容器的引用指向新的容器。这样就完成了整个修改过程。
借鉴的是Linux写时拷贝技术(copy-on-write)思想。
这个容器用来解决什么问题的?
- 迭代期间允许修改集合内容
- CopyOnWriteArrayList 利用了“不变性”原理,因为容器每次修改都是创建新副本,所以对于旧容器来说,其实是不可变的,也是线程安全的,无需进一步的同步操作。我们可以对 CopyOnWrite 容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素,也不会有修改。
参考:
CopyOnWriteArrayList应用场景
Linux写时拷贝技术(copy-on-write)
以上是 总结:Java随笔 的全部内容, 来源链接: utcz.com/z/518792.html