Java再学习——CopyOnWrite容器

一,定义

  CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。目前Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。

二,优缺点

  CopyOnWrite容器有很多优点,但是同时也存在两个问题,即内存占用问题和数据一致性问题。所以在开发的时候需要注意一下。

  1,内存占用问题。因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所以有两份对象内存)。针对内存占用问题,可以通过压缩容器中的元素的方法来减少大对象的内存消耗或使用其他的并发容器。

  2,数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,那就不可以用CopyOnWrite容器

时间: 2024-09-30 14:39:33

Java再学习——CopyOnWrite容器的相关文章

并发-Java中的Copy-On-Write容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet.CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到. 什么是CopyOnWrite容

Java再学习——深究static关键字

一.static关键字的用途 可以在没有创建对象的情况下来进行(方法/变量)调用.也就是,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. 1,static修饰方法 static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了.并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变

Java基础学习--对象容器

要用Java实现记事本的功能.首先列出记事本所需功能: 可以添加记录(字符串): 可以获得记录条数: 可以删除其中某一条记录: 可以获得指定第几条的记录: 可以列出所有的记录. 如果这个记事本是某个大程序的其中一部分,也就是说还有上层程序,那么上层程序就有可能会调用这个记事本以上列出的某个数据. 所以我们称上述多列功能为这个记事本的 接口 . 那么调用这些接口就是通过记事本这个类的public函数(method). 但是,怎么实现记录呢?显然所记录的字符串不能记录在某个数组里,因为数组的长度是预

Java再学习——线程之创建

Java创建线程有两种方法,一种是继承Thread,另一种实现Runnable或Callable接口. 一,继承Thread public class APP { public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { int i = 0; while (i < 100) { System.out.println(i++); try { Thread

Java再学习——随机面试题

1.final, finally, finalize的区别 final—是修饰符,可以修饰变量.方法和类. final类不能再派生出新的子类即不可当父类: final变量必须在声明时给定初值或在构造方法中赋值,在以后的引用中只能读取,不可修改. final方法不能重载. finally—在异常处理时提供 finally 块来执行收尾操作.如果抛出一个异常,那么相匹配的 catch 子句就会执行,而finally则是只要try代码块有执行(无论return与否),最后都会进入到 finally 块

Java再学习-JVM类加载和执行机制

  JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器

Java再学习-反射机制

首先说到反射,大家肯定不会陌生,如果不知道反射,相信那些市面上常用的主流框架就不会出现了.废话不说,上主题! Java反射机制 运行时 判断任意一个对象所属的类 构造任意一个类的对象 判断任意一个类所具有的成员变量和方法 调用一个对象的方法 注意点:运行时,而不是编译时 首先概念性的东西,小编就不细说了,想了解的直接问度娘吧,直接上干货吧. 通过反射来进行方法调用的具体步骤: 1.首先要获取Class对象(手段比较多,例如通过forname手段和InvokeTester.class手段) 2.如

Java再学习——栈(stack)和堆(heap)

一.内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的

Java再学习——关于ConcurrentHashMap

ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制. 1,在并发方面, ConcurrentHashMap提供了好得多的并发性.多个读操作几乎总可以并发地执行,同时进行的读和写操作通常也能并发地执行,而同时进行的写操作仍然可以不时地并发进行(相关的类也提供了类似的多个读线程的并发性,但是,只允许有一个活动的写线程). 而现有的Hashtable或者SynchronizedMap采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个