Java-第十六部分-JUC

409 阅读2分钟

写在开头

  • JUC,java.util.concurrent,1.5后出现
  • 进程和线程
  1. 进程,计算机中关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
  2. 线程,操作系统进行运算调度的最小单元,是进程中的实际运作单位,一个进程包括多个线程
  • 线程状态
public enum State {
    //新建
    NEW,
    //准备就绪
    RUNNABLE,
    //阻塞
    BLOCKED,
    //不见不散,
    WAITING,
    //过时不候
    TIMED_WAITING,
    //终结
    TERMINATED;
}
  • wait和sleep,在哪里睡,就会在哪里醒
  1. wait是Object的方法,任何对象实例都可以调用;sleep是Thread的静态方法
  2. wait会释放锁,单调用它的前提是当前线程占有锁,代码要在synchronized中;sleep不会释放锁,也不需要占用锁
  3. 都可以被interrupted中断
  • join方法,内部调用wait,阻塞主线程,直到该线程执行完毕,才会到主线程执行,但不影响其他线程执行
  • 并发与并行
  1. 并发,同一时刻多个线程访问同一个资源,多个线程对一个点;春运抢票、电商秒杀
  2. 并行,多项工作一起执行,之后再汇总
  • 管程对象
  1. Monitor 监视器,锁;是一种同步机制,保证同一个时间,只有一个线程能去被保护的数据/代码
  2. jvm同步基于基于和退出,使用管程对象进行实现,跟随java对像生命周期一样
  3. 只有持有管程对象,才能执行同步方法,执行完成后,才能释放管程对象
  • 用户线程和守护线程
  1. 用户线程,一般的线程,自定义线程;守护线程,后台中执行的线程,如垃圾回收
  2. 主线程结束,用户线程运行,jvm仍然存活
  3. 没有用户线程,都是守护线程,主线程结束,jvm结束
Thread aa = new Thread(() -> {
    System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
    while (true) {
    }
}, "aa");
//设置为守护线程,要在start之前
aa.setDaemon(true);
aa.start();

Lock接口、线程间通信和集合的线程安全

多线程锁、Callable接口和辅助类

读写锁和阻塞队列

线程池、分支合并框架和异步回调

synchronized、锁和对象头

AQS

内存模型、CAS、volatile和一些概念

ThreadLocal

Unsafe和ConcurrentHashMap-jdk1.7

ConcurrentHashMap-jdk1.8

线程