在JDK1.5之前,Java中拥有的与线程和同步相关的组件有:
- 描述线程的类Thread,代表线程任务的接口Runable;内置条件队列操作接口Object.wait()/notify()/notifyAll(),它们都位于java.lang包;
- 提供volatile关键字,用来保证单操作变量的内存可见性;提供synchronized关键字作为内置锁,用来保证线程同步
- 提供简单且效率低下的并发容器,比如Hashtable、Vector等,位于Java.util包。
可以看到,此时的Java对于并发编程的支持还是很简陋和原始的,比如想要开多条线程只能手动new多个Thread对象。JDK1.5的时候增加了许多线程和同步有关的特性,大大提高了使用Java进行并发编程的效率:
- 加强了volatile关键字的语义,JDK1.5开始volatile关键字能够防止编译器对被声明volatile的变量进行重排序,即在volatile变量访问前的代码不可以排到访问后;访问后的代码不可以排序到访问前。从而可以真正的用来实现安全的双重检测锁(JDK1.5之前的双重检测锁都是不安全的,因为volatile关键字不具有禁止重排序语义)。
- 增加了java.util.concurrent包,又称并发包、JUC。JUC中包含了大量在java并发编程中非常有用的工具类,包括五个部分:
a) locks部分:在java.util.concurrent.locks包中,提供更加强大的显式锁,比如 重入锁ReentrantLock、读写锁ReadWriteLock;
b) atomic部分:在java.util.concurrent.atomic包中,提供原子变量类相关的功能,是构建非阻塞算法CAS的基础,比如AtomicInteger;
c) executor部分:在java.util.concurrent包中,提供线程池相关的功能,用于批量创建、管理线程,比如ThreadPoolExecutor等,以及对线程任务的加强,比如Callable等
d) collections部分:在java.util.concurrent包中,提供一系列高性能的并发容器,比如ConcurrentHashMap、CopyOnWriteArrayList等;
e) tools部分:在java.util.concurrent包中,提供简单高效的同步工具类,如信号量Semaphore、闭锁CountDownLatch、栅栏CyclicBarrier等;
本文只是一个JUC的整体架构介绍,后续我们将会详细介绍JUC包的每一部分的重点内容、源码!
如果有什么不懂或者需要交流,可以留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!