跳出来,看全景
三个核心问题:分工、同步和互斥
- 分工指分配任务
- 同步指的就是线程间的协作,即一个线程执行完了一个任务,如何通知执行后续任务的线程开工。在 Java 并发编程领域,解决协作问题的核心技术是管程。管程是一种解决并发问题的通用模型,除了能解决线程协作问题,还能解决下面我们将要介绍的互斥问题
- 分工、同步主要强调的是性能。互斥强调的是正确性。专业术语叫“线程安全”。并发程序里,当多个线程同时访问同一个共享变量的时候,结果是不确定的。不确定,则意味着可能正确,也可能错误,事先是不知道的。而导致不确定的主要源头是可见性问题、有序性问题和原子性问题,为了解决这三个问题,Java 语言引入了内存模型,内存模型提供了一系列的规则,利用这些规则,我们可以避免可见性问题、有序性问题,但是还不足以完全解决线程安全问题。解决线程安全问题的核心方案还是互斥。互斥,指的是同一时刻,只允许一个线程访问共享变量。实现互斥的核心技术就是锁。比如Java的synchronized和SDK中的Lock,虽说锁解决了安全性问题,但同时也带来了性能问题,那如何保证安全性的同
时又尽量提高性能呢?可以分场景优化,Java SDK 里提供的 ReadWriteLock、StampedLock 就可以优化读多写少场景下锁的性能,使用无锁的数据结构如Java中的原子类。还有其他方案原理是不共享变量或者变量只允许读,这里Java 提供了 Thread Local 和 final 关键字,还有一种 Copy-on-write的模式。
并发编程高屋建瓴图
钻进去,看本质
- 光跳出来还不够,还需要下一步,就是在某个问题上钻进去,深入理解,找到本质
- 探索技术背后的理论模型