它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。并行与否程序员无法控制,只能让操作系统决定。
2 .volatile 是Java虚拟机提供的轻量级的同比机制。 保证可见性,不保证原子性,禁止指令重排。
3 .JMM内存模型 是一种抽象概念本身并不存在,描述的是一组规则或规范,定义了程序中各个变量的访问方式 可见性 ,原子性,有序性
4. Unsafe是CAS的核 务* .
var1 对象 Var2 内存偏移量 va5 实际的值 var4要加的值
synchronized加锁,一致性得到保障,并发性下降
CAS 不加锁 听过多次比较 ,一致性,并发性都得到保障 *
5. 原子引用
5.1 时间戳原子引用解决ABA问题
6. 集合不安全系列
6.1 Arraylist / HashSet / HashMap ConcurrentModificationException 并发修改异常
并发争抢修改导致,一个线程正在写入,另一个线程过来抢夺,导致数据不一致.
HashSet 底层是HashMap value 是object类的常量
List<String> list1=new Vector<>(); //解决方法
List<String> list=Collections.synchronizedList(new ArrayList<>());
Set hashSet=Collections.synchronizedSet(new HashSet<>());
Set hashSet1=new CopyOnWriteArraySet();
List<String> list2=new CopyOnWriteArrayList<>(); //写时复制
public boolean add(E e) { //CopyOnWriteArrayList的add方法
final ReentrantLock lock = this.lock;
lock.lock(); //加锁
try {
Object[] elements = getArray(); //获取数组数据
int len = elements.length; //获取长度
Object[] newElements = Arrays.copyOf(elements, len + 1);//创建新数组并长度加1,复制原有数据
newElements[len] = e;//在最后边添加数据
setArray(newElements);//重新放回资源类
return true;//通知系统可以操作
} finally {
lock.unlock();//释放锁
}
7. JAVA 锁
ReentrantLock(false/true) 是可公平锁, synchronized 是非公平锁. synchronized,ReentrantLock都是可重入锁.最大的做用是避免死锁.
7.1 *CountDownLatch 倒数计数器 Enum的使用*
7.2 CyclicBarrier 加法
7.3 **Semaphore* 信号标* 一是用于多个资源的互斥作用,二是用于并发线程数的控制。
8. *阻塞队列*
题目:一个初始值为零的变量,两个线程对其交替进行加1减1的操作来5轮
1.线程 操作(方法) 资源类
2.判断 干活 通知
3.防止虚假唤醒机制