文章目录
一、JUC相关知识:
①什么是JUC?
在 Java 5.0 提供了 java.util.concurrent(简称JUC)包。在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架,还提供了设计用于多线程上下文中的 Collection 实现等。
②并发编程的意义
1、并发编程的优点
ⅰ.通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。
ⅱ.面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合业务拆分。
2、并发编程的缺点
ⅰ.频繁的上下文切换,非常损耗性能。
解决方案:无锁并发编程、CAS算法、使用最少线程、协程等。
ⅱ.线程安全问题。
多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用。
解决方案:
⒈避免一个线程同时获得多个锁。
⒉避免一个线程在锁内部占有多个资源,尽量保证每个锁只占用一个资源。
⒊尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞。
⒋对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
ⅲ.过多的线程可能造成内存不足的问题。
解决方案:合理使用线程池。
ⅳ.可能造成某个操作无法向下运行,比如饥饿问题。
③并发的一些相关概念
1、同步和异步
同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。
异步调用开始后,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。
2、并发和并行
并发指的是多个任务交替进行,而并行则是指真正意义上的“同时进行”。
实际上,如果系统内只有一个CPU,而使用多线程时,那么真实系统环境下不能并行,只能通过切换时间片的方式交替进行,而成为并发执行任务。真正的并行也只能出现在拥有多个CPU的系统中。
3、阻塞和非阻塞
阻塞和非阻塞通常用来形容多线程间的相互影响。
比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞;而非阻塞就恰好相反,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。
4、临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每个线程使用时,一旦临界区资源被一个线程占有,那么其他线程必须等待。
二、JUC包结构:
①JUC包内容
翻看源码,第一眼看到的就是包结构:atomic和locks子包,还有很多类文件。根据功能大致划分,结果如下图所示:
②代码层次结构
③各模块详细内容
1、atomic
2、locks
3、collections
4、threadPool相关
5、tools
系列文章传送门:
JUC探险-1、初识概貌
JUC探险-2、synchronized
JUC探险-3、volatile
JUC探险-4、final
JUC探险-5、原子类
JUC探险-6、Lock & AQS
JUC探险-7、ReentrantLock
JUC探险-8、ReentrantReadWriteLock
JUC探险-9、Condition
JUC探险-10、常见工具、数据结构
JUC探险-11、ConcurrentHashMap
JUC探险-12、CopyOnWriteArrayList
JUC探险-13、ConcurrentLinkedQueue
JUC探险-14、ConcurrentSkipListMap
JUC探险-15、BlockingQueue
JUC探险-16、ThreadLocal
JUC探险-17、线程池