线程不安全
会出现丢值或者重复的情况
Collection集合下的线程安全
重要:支持复合操作的线程安全的
1.CopyOnWriteArrayList();
2.CopyOnWriteHashMap
别的线程安全的,都是不支持复合操作的
- StringBuffer
1.List集合
CopyOnWriteArrayList();
- 线程安全;
- 支持复合操作及在迭代器中一遍编列 一边添加元素
- 原理:写入并复制,每次要创造新的并添加进去刚加的;内部lock锁加持使线程安全;自己复制自己的;添加自己的;所以可以复合操作
- List list =new CopyOnWriteArrayList();//要自己看学西怎么使用API
synchronizedList(); - 是一个静态的方法 ;内部有个三目运算符;返回的是SynchronizedList对象 静态内部类
- 静态内部类是同步代码快 把List接口的方法全部重写一遍 把所有的方法写道同步代码块中;不会出现先出不安完的情况
- 属于第三次开发;
-
一次开发:没有这个东西 我生成了
-
二次开发: 对其进行封装
-
三次开发 在已有的基础上在加写功能
Map集合下的线程安全
1.ConcurrentHashMap
- 原理:分占锁 默认16大小 有16个锁 每个锁代表一个对象 Segment 每个Segment存了一个Hash表 每个Hash表还能存链表 每个线程都有机会抢占到一个Segment 这个没有整体锁 并行 即可以在进程也可以体现在线程
- 性能:ConcurrentHashMap性能比HashTable快 他又16个锁 多个线程同时抢锁 并行 多个线程一起进行 可以同时删除和修改 不会出现并发修改异常
2.Hashtable
- 原理:独占锁 外面有个大锁;一个线程进去别的就进不去 串行 会出现并发修改异常
package Hashtable;
import java.util.Hashtable;
import java.util.Map;
//Hashtable
/*
* 是线程安全 性能满 采用的是独占锁
* Hashtable不可以让key或value存储null
*
* ConcurentHashMap 线程安全
*独占锁:
*
*
* */
public class Default {
public static void main(String[] args) {
Map<Integer,String> map =new Hashtable<>();
//map.put(null, null);//键和值都不能为null
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
map.put(4, "D");
System.out.println(map);
}
}