- 三种创建线程方式
- callable区别: 不仅可以运行线程,还可以返回结果
- synchronized: 有很多种情况
- 锁的本质:在对象头里面有Mark Word 会存储状态
- 锁升级?什么是轻量级锁
- wait-notify
- wait和notify为什么必须和synchronized一起使用
- 因为wait和notify是独占锁,所以必须使用
- 为什么wait时候必须释放锁
- 防止死锁
- Interrupted
- 可以中断线程
- 只有声明了会抛出InterrupedException的函数才会抛出异常
- 捕获后就可以清楚状态
- 能够被中断的,叫做轻量级锁
- LockSupport.park()
- 如何优雅的关闭线程
- 不建议使用stop、destroy(); 资源无法释放,不保证finally里释放
- 循环时候给个信号
- 守护线程: 非守护线程才关系到程序的停止
- 并行和并发:
- 并行:多核上同时运行
- 并发:通过程序并发的运行
- 同步:
- 控制同步
- 数据访问同步
- 临界段
- 多线程的情况下,保护起来一段代码
- 死锁
- 四个条件
- 活锁
- 举例: 骑自行车
- 内存可见性
- 本地内存和共享内存
- 重排序
- 编译器重排序
- CPU指令重排序
- CPU内存重排序
- 内存屏障
- 两个LoadLoad之间不允许重排序
- 单线程重排序
- 如果没有前后依赖,那么可能会重排序
- 多线程重排序
- 只能保证单个线程是不重排序
- happen-before
- 单线程中
- volatile
- synchronized的解锁、加锁
- JUC里并发容器
- ArrayBlockingQueue
- 成环数组
- 一个锁、一个条件
- LinkedBlockingQueue
- 单向链表
- 两个锁、两个条件
- PriorityBlockingQueue
- 需要compaable
- 二叉小根堆
- BlockingDeque
- 阻塞的双端队列
- 只用LinkedBlockingDeque
- 一把锁,两个条件
- 同步工具类
- Semaphore
- 信号量,控制最多同时多少个
- 大学生抢座
- acquire()、release()
- CountDownLatch
- 主线程等待
- 底层AQS、通过queue方式去等待
- 用到了公平锁和非公平搜
- CyclicBarrier
- 分阶段
- 集体笔试、集体面试
- Exchanger
- 交换数据、阻塞
- phaser
- 可以替代那两个
- 原子类
- 主要用到CAS操作
- 用的自旋策略
- 自旋与阻塞
- 两种策略
- 轻量级锁:可以唤醒
- Lock和Condition
- 互斥锁、可重入锁

并发度主键增高
- 线程池
- Executors工具类
- ScheduledThreadPoolExecutor
- CompletableFuter
- ForkJoinPool
- 类似于MapReduce
- 将一个大的任务等待执行
- 阻塞-入栈;唤醒-出栈
- 子任务可以执行完了,自动去找活干,可以保证负载均衡
- 设计模式
- 单线程设计模式: 保证临界区
- Immutable模式:不变的,不可发生改变
- Guarded Suspension模式
- 比较常用
- 用法:while里面进行判断
- Balking
- 类似Guarded
- 不同于while,如果if发现保存过了,就推出了
- 读写锁模式 Read-Write Lock
- while里面判断的东西多一些,同时判断读和写
- Thread-Per-Message
- 类似于Tomcat,每个请求一个县城
- Worker Thtread
- 类似于Executor,有的话就干活,没有就等待
- Future模式
- 可以调到回调函数,等完事后才能返回结果
- 用在Callable上
- CountDownLatch
- 可以最后关闭资源
- Java内存模型
- 截图六点
- 写上标题就好
