java 多线程梳理
start和run方法区别,start 方法开启一个新的线程区执行,run是当前线程发起。可以看jvm.cpp有一个jvm_startThread 的方法。
runnable 接口和thread 关系,runnable就是一个有run方法的接口而已。
线程的6个状态,new ,runnable,waiting ,timed-wating ,blocked,terminated
sleep只会让出cpu,wait会让出cpu和锁。 sleep只能和synchronized 结合使用。
wait 和while经常一起使用为什么?不是wait 和if
使用condition ReentrantLock await() ,signalAll();
Threadlocal 线程的局部变量!
内部的结构了解下
volatile 内存可见性,防止指令重排,内部是用内存屏障 保证。强制刷新到主内存的。
variable handle api jdk 9 需要看看。
synchronized和lock
synchronized 底层是用对象头 mark word,实例数据,对齐填充
mark word 中存储 对象年龄,hashcode,锁类型,锁标位
preBlockPin 参数
自旋锁,自适应自旋锁,锁消除,锁粗化
一个线程在进入同步代码时候,默认进入偏向锁,同时修改mark word 扩大把当线程的id 设置成synchronized Markword 中的threadid,这样省去获取锁的时间。
当第二个线程加入锁竞争的时候,就会膨胀位轻量级锁00,如果有多个线程竞争,那么升级为重量级锁
synchronized 修饰普通方法是锁定this对象,修饰到静态方法是锁定class对象。
synchronized 是可重入锁,底层是jvm 命令monitor enter 和exit ,修饰到代码块是常量池ACC_SYNCHRONIZED标识修饰,如果发生异常jvm底层自动释放锁的。
ReentrantLock 可以替代synchronized ,发生异常需要手工释放锁。另外还有trylock方法尝试加锁,trylock(5,timeunit.second)
Unsafe.park 方法的
实现多路的通知,配合condition
Lock.lockinterrunptibly(); 打断另外线程占有的锁,从而响应中断操作。
还可以配合condition 结合使用,底层是AQS实现。 AQS是 CAS实现,可以通过构造方法构造是否为公平锁。
理解 Java 对象头与 Monitor
jmm java 内存规范
happen-before ,可见性,指令重排
同步容器
CurrentLinkedQueue poll 拿数据
CurrentHashMap,currentSkipListMap,
有序的map
TreeMap 需要实现compare接口,SortedMap,LinkedMap
CopyOnWriteArrayList 写时复制 ,读效率高,写效率低
currentLinkedQueue 无界队列 offer ,peek拿不删 ,poll 拿出来删除
BlockingQueue put 和 take 方法都是阻塞的
LinkedBlockingQueue
ArrayBlockingQueue 有界队列 注意put 阻塞方法
DelayQueue 添加元素要实现Delayed 实现compare接口
transferQueue 先启动消费者,p发现有消费者直接消费,不用加入队列。 Transfer阻塞方法
SynchronusQueue 无容量队列,注意区分put阻塞 和add 二个方法,add 报错队列满。
Executor接口
ExecutorService接口,submit等接口,runnable,callerable 接口,可以抛出checkedException 有返回值
Executors 操作Executor的工具类
ThreadPool 接口
Executors.newfixedThreadPool
Future 和FutureTask 后者包装了一个callable ,future.get() 阻塞future.isdone()
newCachedThreadPool 默认60s销毁,最大线程为Integer.maxValue
ScheduleThreadPool 4个参数,commnd ,时间,周期,time单位。
workingStealingPool 用forkJoinPool 实现
ForkJoinPool ForkJoinTask —》RecursiveTask(有返回值) 或者RecursiveAction (无)
对数据进行切分,执行fork方法
ThreadPoolExecutor 除了scheduleThreadPool其他的线程池都是拿它进行实现。
核心线程数,最大线程数,存活时间,存活时间单位,阻塞队列,拒绝策略