并发工具总的可以分为三类:
- 为了并发安全的
- 为了管理线程提高效率的
- 为了线程协作之间配合的
为了并发安全的
- 互斥同步
synchronized、ReentrantLock、ReadWriteLock等各种锁,当然也包括Collections.SynchronizedMap,使用synchronized的集合Vector、HashTable - 非互斥同步
主要包括Atomic包下的很多原子类 - 结合互斥同步和非互斥同步 ,也就是利用成熟的工具类
主要指线程安全的并发容器,如使用了synchronized和cas的ConcurrentHashMap,CopyOnWriteArrayList,ConcurrentSkipListMap和ConcurrentSkipListSet,还包括阻塞队列和非阻塞队列 - 无同步方案,即避免共享变量
如final,ThreadLocal,栈封闭
为了管理线程提高效率的
线程池相关、获取子线程运行结果的Callable、Future、FutureTask等
线程之间配合的
CountDownLatch、Semaphore、Condition、Phaser、Exchanger、CycliBarrier等
java线程属于什么线程?
线程是调度CPU的最小单元,有两种线程模型
- ULT 用户级线程,也叫协程
用户程序来实现,不依赖操作系统核心,应用控制线程的创建、同步、调度和管理;不需要用户态/内核态切换;内核对ULT无感知,线程阻塞则进程阻塞。 - KLT 内核级线程
系统内核保存线程的状态和上下文,线程的创建、调度和管理由内核完成,效率比ULT要慢一些。线程阻塞不会引起进程阻塞。在多核处理器上,多线程并行运行。
要使用内核空间需要提高权限,所以要切换到内核态获取内核空间的权限,然后调用系统接口创建线程。这是比较重的操作
JVM使用的是内核级线程,证明:JVM创建多个线程后可以在任务管理中看到系统线程数对应增加。