- Thread是对线程的抽象,Runnable是对任务的抽象
- JDK的线程是协作式的,不是中断式的。
- 死锁状态不会被中断。
- start方法启动,仅能执行一次
- run方法算是业务逻辑,不是启动程序本身
- yield()会让出cpu,不会让出锁
- join()在线程中中断执行其他的线程,保证两个线程顺序执行
- 守护线程中的finally不一定执行
- 线程优先级:?? 2-10 只是优先级较高的线程执行次数较多
- synchronized内置锁,对象锁
- this和对象锁(方法和同步块)
- 类锁和对象锁的区别????
- run方法可以执行多次? 多次
-
NEW,实现Runable接口和继承Thread可以得到一个线程类, new一个实例出来,线程就进入了初始状态。
-
READY,只是资源准备好,没有获得CPU执行权。start进入执行
-
TIMED_WAITING
-
常用类型的 Integer的i++使得 锁的对象发生了变化。
-
volatile 不能保证线程的安全,仅是保证变量使得class可见(一写多度)
-
ThreadLocal为每个线程提供变量副本,实现了线程隔离,spring使用事务的使用 了ThreadLocal,保证了每个Thread都有一个ThreadLocalMap,其中key为当前的ThreadLocal,value为具体的值。
- 弱引用,弱引用虽然不能保证ThreadLocalMap的内存泄露,但是可以为解决内存泄露提供了一层屏障,因为当使用暴露接口set/get或者其他方式的时候 会进行value=null进行回收。清除不及时。
- ThreadLocal仅是保证了不同线程之间调用同一份的变量备份。
- static变量需要注意,就是每个class的static变量只是加载一次。
-
强/软/弱/虚引用
-
软:若内存空间足够,垃圾回收器就不会回收它,若内存空间不足,就会回收这些 对象的内存。
-
弱:不论当前空间是否充足,都会回收它的内存。
-
虚:在任何时候都会被垃圾回收器进行回收。
-
-
wait释放锁,notify/notifyAll不释放锁
-
Fork/Join工作
-
CountDownLatch的作用
-
乐观锁-CAS(Compare And Swap) compare/swap->CAS指令 CAS指令(内存地址V,旧值,新值) 问题:
- ABA问题 + 版本号
- 开销问题 (自旋死循环问题)
- 只能保证一个共享变量的原子操作
-
ABA操作:JDK原子操作类中有方法可以进行操作
-
显示锁 + AQS
-
显示锁:Lock接口和核心方法(lock/unlock/tryLock)
- 会消耗内存等
-
可重入锁,不会把自己(函数)锁住
-
公平锁:拿锁和释放锁的顺序是一致的
-
非公平:利用线程唤醒的时间进行
-
ReadWriteLock接口和读写锁ReentrantLock、ReenReadLock
-
场景:读多写少(业务场景) -> 读写(10:1)分离
- 读写分离锁
- 读写锁互斥性:写锁严格性更强,
- ReadWriteLock/
- 等待通知:Lock和Condition
-