并发编程的核心问题
并发编程有三大核心问题:分工问题、同步问题、互斥问题。
1. 分工问题
分工问题指的是:如何将一个比较大的任务拆分成多个大小合适的任务,再交给合适的线程去执行。
在Java中,线程池、Fork/Join框架和Future接口都是实现分工的方式。
2. 同步问题
同步指的是:一个线程执行完自己的任务之后,以何种方式通知其他线程继续执行任务。
同步机制:一个线程执行完自己的任务之后,通知其他线程继续执行任务的方式。
在Java中,Semaphore、Lock、Synchronized、CountDownLatch、CyclicBarrier、Exchanger和Phaser等工具类或框架实现了同步机制。
3. 互斥问题
互斥指的是在同一时刻只允许一个线程访问临界区的共享资源。
在并发编程中,分工和同步强调的是任务的执行性能,而互斥强调的则是任务执行的正确性,也就是线程的安全问题。如果在并发编程中,多个线程同时进入临界区访问同一个共享变量,则可能产生线程安全问题,这是由线程的原子性、可见性和有序性问题导致的。
在并发编程中解决原子性、可见性和有序性问题的核心方案就是线程之间的互斥。
在Java中,有Synchronized、ThreadLocal、CAS、原子类和以CopyOnWrite开头的并发容器类、Lock锁及读/写锁实现了线程的互斥机制。