1.线程状态
1.NEW状态
创建了一个Thread对象,并没有处于执行状态,因为没有调用start方法启动该线程,那么此时的状态就是新建状态。
2.Runnable状态
线程对象通过start方法进入runnable状态,启动的线程不一定会立即得到执行,线程的运行与否要看CPU调度,我们把这个中间状态叫可执行状态(RUNNABLE)
3.Running状态
线程一旦获取到CPU,进入运行状态,此时它才真正的执行自己的逻辑代码
4.BLOCKED状态
线程正在等待获取锁
- 进入阻塞状态,比如调用了sleep或者wait方法
- 进入某个阻塞的IO操作,比如因网络数据的读写进入Blocked状态
- 获取某个锁资源,从而加入到该锁的阻塞队列中而进入Blocked状态
5.TERMINATED状态
是线程的最终状态,在该状态下线程不会在切换到其他任何状态了,代表整个生命周期都结束了。
2.停止线程
- run()方法执行完毕,自然终止
- 停止一个线程的操作需要使用Thread.interrupt()等于给线程打一个停止标记,此方法不会终止一个正在运行的线程,需要加入一个判断才能完成线程的停止
interrupted:判断当前线程是否已经中断,会清除状态
isInterrupted:判断线程是否已经中断,不会清除
状态
3.什么是原子操作
不可被中断的一个或一些列操作
4.如何实现原子操作
java中通过锁和循环CAS的方式来实现原子操作。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。
6.CAS实现原子操作的三大问题
ABA问题,循环时间长消耗资源大,只能保证一个共享变量的原子操作。
7.什么是ABA
因为CAS需要在操作值的时候,检查值有没有变化,如果没有变化则更新,如果一个值原理是A,变成了B,又变成了A,那么使用CAS进行检测时会发现值没有发生变化,其实是变化过的。
解决:
添加版本号,每次更新的时候追加版本号,A-B-A ->
1A->2B->3A
从jdk1.5开始,Atomic包提供了一个类AtomicStampedReference来解决ABA的问题
8.CAS循环时间长占用资源大问题
加入延时操作?
9.CAS只能保证一个共享变量的原子操作
- 对多个共享变量操作时,可以用锁
- 把多个共享变量合并成一个共享变量来操作
java 1.5开始,jdk提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在一个对象来进行CAS操作。
10.Java并发容器,你知道几个?
ConcurrentHashMap,CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentLinkedQueue,ConcurrentSkipListMap,ConcurrentSkipListSet,ArrayBlockingQueue,LinkedBlockingQueue,LinkedBlocingDeque,PriorityBlockingQueue,SynchronousQueue.
ConcurrentSkipListMap
ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景。
ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表。但是它们之间有以下的区别:
第一:它们的线程安全机制不同,TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的。
第二:ConcurrentSkipListMap是通过跳表
实现的,而TreeMap是通过红黑树
实现的。
但是ConcurrentSkipListMap有几个ConcurrentHashMap不能比拟的优点:
1.ConcurrentSkipListMap的key是有序的。
2.ConcurrentSkipListMap支持更高的并发。也就是在数据量一定的情况下,并发的线程越多,ConcurrentSkipListMap越能体现出他的优势
.在非多线程的情况下,应当尽量使用TreeMap。此外对于并发性相对较低
的并行程序可以使用Collections.synchronizedSortedMap
将TreeMap进行包装,也可以提供较好的效率。对于高并发程序,应当使用ConcurrentSkipListMap,能够提供更高的并发度。
11.Java中原子操作更新基本类型,Atomic包提供了哪几个类?
- AtomicBoolean:原子更新布尔类型
- AtomicInteger:原子更新整形
- AtomicLong:原子更新长整型
12.JAVA中原子操作更新数组,Atomic包提供了那几个类?
- AtomicIntegerArray:原子更新整型数组里的元素
- AtomicLongArray:原子更新长整型数组里的元素
- AtomicReferenceArray:原子更新引用类型数组里的元素
13.Java中原子操作更新引用类型,Atomic包提供了哪几个分类?
如果原子需要更新多个变量,就需要引用类型了。
- AtomicReference:原子更新引用类
- AtomicReferenceFieldUpdater:原子更新引用类型里的字段
- AtomicMarkableReference:原子更新带有标记位的引用类型。标记位用boolean类型表示,构造方法时AtomicMarkableReference(V initialRef,boolean initialMark)
网友评论