Java 多线程与并发(1-26)-Java 并发 - 理论基础.pdf是一本从理论角度引入并发安全问题以及JMM应对并发问题的原理的书籍。本书带着BAT大厂的面试问题去理解,并提出请带着这些问题继续后文,会很大程度上帮助你更好的理解并发理论基础。书中提到了多线程的出现是要解决什么问题的,线程不安全是指什么以及并发出现线程不安全的本质是什么,即可见性、原子性和有序性。同时,Java是通过JMM和8个Happens-Before关键字来解决并发问题的。书中还讨论了线程安全不是非真即假的,线程安全有多种实现思路以及如何理解并发和并行的区别。
为什么需要多线程呢?众所周知,CPU、内存、I/O设备的速度是有极大差异的,为了合理利用CPU的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:CPU增加了缓存,以均衡与内存的速度差异,导致可见性问题;操作系统增加了进程、线程,以分时复用CPU,进而均衡CPU与I/O设备的速度差异,导致原子性问题;编译程序优化指令执行次序,使得缓存能够得到更加合理地利用,从而导致有序性问题。因此,多线程的出现是为了解决CPU、内存、I/O设备速度差异所带来的问题。
线程不安全指的是多个线程同时访问共享的数据时,由于执行顺序不确定而导致的数据出现异常情况。例如,在多线程情况下对共享变量进行自增操作,由于线程间的不确定性,可能会出现覆盖的情况,导致最终结果不是期望的值。并发出现线程不安全的本质是可见性、原子性和有序性问题。可见性指的是一个线程对共享变量的修改,能够及时被其他线程看到;原子性指的是一个或多个操作要么全部执行,要么都不执行;有序性指的是程序的执行和操作的执行顺序,是按照一定的顺序进行的。这三个问题的存在导致了线程不安全的出现。
Java是通过JMM(Java内存模型)和8个Happens-Before关键字来解决并发问题的。JMM是用于解决可见性、原子性和有序性问题的模型,在JMM中,只要求了float和double类型的变量具备volatile类型的特征,对这两类变量的操作具有原子性。而Happens-Before关键字是用来描述多线程之间的执行顺序,确保程序的正确执行。
线程安全不是非真即假的,而是存在多种实现思路。常见的实现思路包括使用同步锁、原子类、并发容器等。线程安全是一个相对概念,可以通过一定的措施来确保多线程的安全操作。
在并发和并行的区别上,需要明确两者的概念。并发是指多个任务交替执行的过程,而并行是指多个任务同时执行的过程。在计算机领域,通常并发是通过时间片轮转来实现的,而并行是通过多核处理器来实现的。因此,并行一定是并发的,但并发不一定是并行的。
总之,Java多线程与并发理论基础是一本系统地介绍了并发安全问题以及JMM应对并发问题的原理的理论书籍。通过对多线程的出现是要解决什么问题的,线程不安全是指什么以及并发出现线程不安全的本质进行讨论,帮助读者更好地理解并发理论基础。同时,本书介绍了Java是通过JMM和8个Happens-Before关键字来解决并发问题的,以及线程安全不是非真即假,有多种实现思路,以及并发和并行的区别。通过深入理解这些理论知识,读者可以更好地应对并发编程中的各种挑战。