1、新启线程的到底有几种方式?
两种 extends Thread 实现Runnable
Callable 严格说也是实现Runnable 通过FutureTask交给Thread
2、线程的生命周期。/状态
创建状态(初始化) 就绪/运行中 等待/等待超时
synchronized 阻塞态 终止/结束态
阻塞是被迫进入的状态 等待是主动进入的状态
3、死锁和更多的并发安全。
两个或两个以上的进程执行过程中,竞争资源或者彼此通讯造成阻塞,都无法继续下去
多个操作者争夺多个资源,资源少于操作者
争夺资源的顺序不对
拿到资源不释放
改变资源顺序 尝试拿锁 tryL ock
4、ThreadLocal深入理解。
threadLocal里面持有一个threadLocal.threadLocalMap,里面持有Entry继承一个弱引用 Entry(threadLocal,object)
5、什么是CAS?Compare and Swap 比较和交换
现代处理器都支持CAS指令,循环这个指令,直到完成为止
原子操作?要么全部完成,要么全部没完成,不可再分
比如:用锁,比较重量级,所以出现了CAS指令,效率高,不存在上下文切换消耗的时间
CAS 无锁化 高度竞争 特意设计
存在的问题:
1.ABA问题
线程1:A if A 替换为B
线程2:A if A 替换为C 又替换为A,执行快,线程1没发现变化
2.开销问题 一直比较一直比较增加CPU开销
3.只能对一个共享变量操作
Atomic开头的,都是JDK提供的原子变量操作
解决ABA问题,提供版本戳
AtomicMarkableReference 关心有没有动过
- AtomicStampedReference 关心动过以及几次