JUC 1

1.并发与并行

它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。并行与否程序员无法控制,只能让操作系统决定。

2 .volatile 是Java虚拟机提供的轻量级的同比机制。 保证可见性,不保证原子性,禁止指令重排

3 .JMM内存模型 是一种抽象概念本身并不存在,描述的是一组规则或规范,定义了程序中各个变量的访问方式 可见性 ,原子性,有序性

扫描二维码关注公众号,回复: 10978677 查看本文章

 

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.防止虚假唤醒机制



猜你喜欢

转载自www.cnblogs.com/luyuefei/p/12737205.html
JUC