1.List
List<String> list = new ArrayList<>(); 并发读写时,会抛出异常(Java.util.ConcurrentModificationException)
= new vector<>(); 读写操作都加了锁,但性能不理想
= new CopyOnWriteArrayList<>(); 并发读写不会异常,使用写时复制技术
读:并发
写:串行
ArrayList:线程不安全
Vector:线程安全
CopyONWriteArrayList:(以空间换时间)在写操作时,会复制一份数据数组,加锁,写操作完成后,指针指向新数组;读操作不加锁,并发执行
transient:关键字, 它声明的对象不参与序列化
2.set
Set<String> set = new HashSet<>(); 读写并发抛异常(Java.util.ConcurrentModificationException)
=Collections.synchronizedSet(new HashSet<>()); 读写并发不抛异常,但性能不理想
= new CopyOnWriteArraySet<>(); 不抛异常,性能高,以空间换时间
set:无序,不重复,用迭代器遍历
3.Map
Map<String,String> map = new HashMap<>(); 读写并发时异常(Java.util.ConcurrentModificationException)
= new HashTable<>(); 不抛异常,但性能不佳
= new ConcurrentHashMap<>(); 锁分段技术
map:不能用迭代器
HashMap:数组(key,由hashcode对数组取模获得,以便于快速查找)+链表+红黑树(数组长度大于64,链表长度大于8)
HashMap:线程不安全,并发时,报错 java.util.ConcurrentModificationException
HashTable:线程安全
ConcurrentHashMap:锁分段技术,为key分段加锁(将所有key分成很多段,每一段都加锁)
Robbon:微服务 (客户端)负载均衡
线程池
创建线程池用,不能用
线程池和数据库连接池都属于"池技术",复用、高通用性、解决创建不易;管理功能:避免过多创建线程
复用、管理
线程池结构:
1.等待队列:来不及处理的任务
2.核心线程:即使空闲也不会释放
3.非核心线程:空闲时间达到阈值就会释放
4.拒绝策略:线程池内线程已达最大线程数,全部线程都很繁忙,等待队列已满
拒绝策略(4种):
new ThreadPoolExecutor.AbortPolicy() 中断策略,线程池处理不过来时,启动策略,抛出异常(Java.util.concurrent.RejectedException)
new ThreadPoolExecutor.CallerRunsPolicy() 把任务还给调用者(主线程)
new ThreadPoolExecutor.DiscardPolicy() 随即丢弃处理不了的任务
new ThreadPoolExecutor.DiscardOldestPolicy() 丢弃等待时间最久的任务