多线程进阶

多线程进阶

juc-framework

锁对象

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的关系

异步随机数

参考资料

  1. http://tutorials.jenkov.com/java-concurrency/locks.html
  2. http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html
  3. http://tutorials.jenkov.com/java-concurrency/thread-pools.html
  4. http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html
  5. hashtable和concurrentMap的比较
您的支持将鼓励我继续创作!