发布时间:2024-09-08 13:01
引申问题:进程和线程的区别:进程是操作系统分配资源的最小单位,线程是OS进行任务分配的最小单元,线程隶属于进程;
为什么设计这几种?:JDK考虑单继承多实现的机制,
引申-----什么锁,如何加锁?-----synchronized 和 Lock;----引发出一系列锁的问题;
可见性:多个线程访问同一资源变量,该资源变量发生变化后,会触发总线嗅探机制,通过Cpu缓存一致性协议将线程中的内存副本中的缓存行变为失效状态,导致该线程主动重新到主内存load到变量副本中!从而保证可见性;—底层汇编lock指令;
**指令重排:**JVM优化代码的一种手段,通过volatile修饰的变量周围代码段不会发生指令重排,求其原理是底层通过Lock指令添加内存屏障;从而实现防止指令重排; 这也是单例模式加volatile的原因;通过防止 指令重排阻止其他线程读取到半初始化的对象!
指令重排遵从的原则:as-if-serial; happends-before
引申–synchornized关键字,通过资源的竞争触发的锁升级操作
锁操作:对象的对象头;锁对象的标记位;通过标记对象的markword;在其他线程读取该对象的markword就可知道该对象的锁状态!状态分为下面几种,无锁(001)
JVM底层优化机制: -XX:UseBiasedLocking : 是否打开偏向锁;默认不打开;等过了四秒之后new出的对象都加上了偏向锁;
AQS:JDK 提供的线程同步框架;李二狗开发;基于Lock接口实现锁机制; 核心:通过一个state信号量以及双向循环链表;线程排队,通过state信号量规范控制线程排队或放行;在不同的场景下有不同的意义;
可重入锁:同一个线程多次进入同一个加锁的代码段,state表示加锁次数,0表示无锁,加一次锁就+1,释放锁就-1;
考察并发工具;countdownlatch、cylicBarrier、Semaphore。
countDownlatch:线程同时执行,同一起跑线;(同时执行)
cylicBarrier:定义座位数,等座位站满了就走(同时执行)
Semaphore:给线程分配不同的重要性,定义信号数量,给线程定义权重,线程必须获得相应的信号数量才能执行;(依次执行,交错执行)
含义;考察fork/join框架,分而治之!其实就是归并排序,但是使用并发执行;
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,RejectedExecutionHandler handler)
corePoolSize -- 核心线程容量
maximumPoolSize -- 最大线程容量
keepAliveTime -- 线程无任务的存活时间
unit -- 时间
workQueue -- 阻塞队列
threadFactory -- 线程工厂
handler -- 拒绝策略