总结: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

回到顶部