多线程进阶
锁对象
synchronized关键字内部使用的是一种较为简单的重入锁机制,可以通过Lock接口来实现相应的功能。Lock接口的好处在于在尝试获取对象锁时,可以直接返回或者等待一段时间后再返回,更为灵活
另外,读写锁提供了更为精巧的方式来控制同时读写的问题,它特别适合于解决读写互斥,写写互斥,但读读不互斥的情景。
在使用Lock接口时,获取锁对象后,注意要把解锁的操作(unlock)放在finally块中,否则锁对象将被一直占用,导致后续的线程无法继续
Executor
这部分内容可分为三部分,分别为:
Executor接口: executor, executorService, ScheduledExecutorSerivce
线程池
Fork/Join框架
1. Executor接口
Runnable, Future, Callable: Runnable是用来运行任务,它没有返回值,相对地,callable有返回值,并且有可能会抛出异常;Callable调用时会返回future,可以通过future对象来控制线程的状态,比如取消,等待结果等等
ExecutorService: 在executor的基础上增加了对线程管理和线程池管理的函数,并且可以执行callable线程(Executor只能执行runnable线程,且没有管理生命周期的功能)
2. 线程池
线程池可以重复地利用已经存在的线程,一方面可以节省重复创建线程的时间,另一方面也可以防止大量的创建线程导致系统资源耗尽。一般情况下,线程池需要配合阻塞队列来实现,这样,当外部提交执行任务时,只需要往队列里塞入相应的任务即可,在线程池内部的线程处于空间状态时,会自动地去消费队列中的任务,如果此时队列为空,则阻塞等待,其实质是“生产者-消费者”
3. Fork/Join框架
待理解
异步集合
BlockingQueue: 阻塞队列,从队列中获取元素时,它会阻塞或超时(javadoc)
ConcurrentMap: map的异步实现,它将增加、删除或者修改键值的操作原子化,从而避免了同步操作(javadoc)
ConcurrentNavigableMap: 支持模糊匹配的map实现,可以认为是treeMap的异步实现(javadoc)
原子变量
对原子变量的操作都是原子性的,也就是说,set操作和之后的get操作有happens-before的关系
异步随机数
略