CopyOnWriteArrayList CopyOnWriteArrayList适合于多线程场景下使用,其采用读写分离的思想,读操作不上锁,写操作上锁,且写操作效率较低. CopyOnWriteArrayList基于fail-safe机制,每次修改都会在原先基础上复制一份,修改完毕后在进行替换. CopyOnWriteArrayList采用的是ReentrantLock进行上锁. CopyOnWriteArrayList和ArrayList一样,其底层数据结构也是数组,加上transient不…
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的.主要有以下两个原因: 1. ArrayList 自身的 elementData.size.modCount 在进行操作的时候,都没有加锁: 2.这些变量没有被 volatile 修饰,在多线程的情况下,对这些变量操作可能会出现值被覆盖的情况: 如果我们想在多线程情况下使用 ArrayList 怎么办?有以下几种办法: 使用 Collections.SynchronizedLis…
@ 目录 1.JUC 简介 2.线程和进程 3.并非与并行 4.线程的状态 5.wait/sleep的区别 6.Lock 锁(重点) 1.Lock锁 2.公平非公平: 3.ReentrantLock 构造器 4.Lock 锁实现步骤: 7.synchronized 和 lock 锁的区别 8.生产者和消费者问题(通信问题) 1.Synchronized 版本 2.JUC 版本 9.八个有关锁的问题 关于锁的八个问题 问题1:两个同步方法,先执行发短信还是打电话? 问题2:如果发短信延迟2秒,谁先…
基本概念解释 并发:一个处理器处理多个任务,这些任务对于处理器来说是交替运行的,每个时间点只有一个任务在进行. 并行:多个处理器处理多个任务,这些任务是同时运行的.每个时间点有多个任务同时进行. 进程与线程:一个进程可以拥有多个线程,线程是系统调度的最小单位.理论上一个进程可用的虚拟空间是2G,默认最多可以拥有2048个线程. CPU上下文切换:CPU给每个任务一定的执行时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个任务,这个过程叫做上下文切换. 线程安全性 可见性,原子性,有…
我们知道 ,hashmap 和 arraylist 是线程不安全的 在多线程环境下有数据安全问题, 当然 我们可以通过Collections的一些方法把他们变成线程安全的, Collections.synchronizedList(list) Collections.synchronizedMap(m) 也可以使用Hashtable 和 vector  但是这样子做,性能不太好. 今天主要说的是juc包的并发容器类,使用跟hashmap 和 arraylist 都是一样的,这里不再详述 主要简述…
1.概述 在Reactor单线程版本的设计中,I/O任务乃至业务逻辑都由Reactor线程来完成,这无疑增加了Reactor线程的负担,高负载情况下必然会出现性能瓶颈.此外,对于多处理器的服务器来说,单个Reactor线程也发挥不了多CPU的最大功效.下面我们对之前单线程版的Reactor进行改进. 改进方向 接受客户端连接请求的不在是单个线程-Acceptor,而是一个NIO线程池. I/O处理也不再是单个线程处理,而是交给一个I/O线程池进行处理. 其实改进方向很明确:就是针对可能的系统瓶颈…
java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack. (01) LinkedList是双向链表实现的双端队列:它不是线程安全的,只适用于单线程. (02) ArrayList是数组实现的队列,它是一个动态数组:它也不是线程安全的,只适用于单线程. (03) Vector是数组实现的矢量队列,它也一个动态…
1. volatile 关键字 多线程访问的时候,一个比较严重的问题就是内存不可见,其实在内存访问的时候每一个线程都有一个自己的缓冲区,每次在做修改的时候都是从主存取到数据,然后放到自己的缓冲区中,在做完修改之后放回主存.这样每一个线程之间的变量是不可见的.造成读到的数据可能始终就是错误的,因此有一个关键字可以使得这个共享变量称为透明的.就好像所有的操作就直接是在内存中操作一样,因为他一直不停的去同步主存的数据. 2.原子性 i++ 这个运算,其实在底层低用的就是临时变量的方式,这样的话虽然是一…
CopyOnWriteArrayList介绍 它相当于线程安全的ArrayList.和ArrayList一样,它是个可变数组:但是和ArrayList不同的时,它具有以下特性: 它最适合于具有以下特征的应用程序:List 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突. 它是线程安全的. 因为通常需要复制整个基础数组,所以可变操作(add().set() 和 remove() 等等)的开销很大. 迭代器支持hasNext(), next()等不可变操作,但不支持可变 r…
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;3. 引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;4. 对象的属性修改类型: AtomicIntege…