一.线程组件
1.线程池
1.1.线程池类型:newSingleThreadExecutor、newFixedThreadPool 等等
1.2. 线程池参数:
1.3.线程池执行原理以及关闭原理:
1.4.线程池终止(具体代码看上述截图):
shutdown:线程池将变shutdown状态,此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务。
shutdownNow:线程池变stop状态,此时不接收新任务,不再处理在阻塞队列中等待的任务,还会尝试中断正在处理中的工作线程。
2.阻塞队列(略)
二.线程方法
包括join(long millis)、wait(long millis)、future、callable等原理。
1. join原理:在ThreadA中调用ThreadB.join();
2. callbale原理: https://blog.csdn.net/u012664375/article/details/66967687
3. ReentrantLock/ReadWriteLock/Semaphore原理
3.1. ReentrantLock原理(以非公平锁举例):
lock.lock()源码如下图所示:
lock.unlock()原理如下图所示:
3.2.ReadWriteLock原理(以非公平锁举例):
ReentrantReadWriteLock.readLock().lock()
ReentrantReadWriteLock.writeLock().lock()原理类似于ReentrantLock的nonfairTryAcquire
3. Semaphore原理(以非公平锁举例)(略):
4. threadllocal原理:
用线程池时若用threadLocal,因为核心线程始终不变,那么核心线程对应的value也不变,则会造成内存泄漏或者生产问题。
三.线程应用场景:生产者消费者、读写问题
1. 参照 https://www.cnblogs.com/xkxf/p/7890686.html
2. 无锁队列
四.线程锁机制:
乐观锁、悲观锁;可重入锁、读写锁;自旋锁;
小结:乐观锁,在ReentrantLock和Sempahore应用的cas;如ReentrantLock首先cas操作,cas失败则加入AQS的CLH队列,否则在进度共享代码块内,若代码块内有Condition,则会在Condition.await()处阻塞、此处为重量级锁;
公平锁与非公平锁,如ReentrantLock的lock.lock()是否立即cas操作;是则为非公平锁;
偏向锁:readlock.lock()首先检查当前是否已有排他锁,若已有排他锁则直接加入aqs,若无排他锁,则cas获取权限;此时偏向锁变为乐观锁;
可重入锁:ReentrantLock在compareAndSetState失败时,若当前线程是成员变量state的set成功的那个线程,则不再加入CLH以及selfInterrupt();