本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!
在早期,计算机只有一个CPU,同一时刻只能执行一个程序,后来有了多任务的说法,多任务是指计算机在同一时刻可以执行多个程序,但这并不是真正意义上的同一时刻,单个CPU 被多个程序共用,操作系统会在运行的运行的程序间相互切换。在相互切换之前会短暂的执行其中的一个。
随着多任务的产生,给程序开发人员带来了新的挑战。程序不能再假定拥有所有的CPU 时间,不能再假定它拥有所有的内存空间和计算机的其他资源。一段好的程序应该释放掉不再使用的资源,以至于其他程序能够使用这些资源。再此之后又出现了多线程,这意味着在同一程序中可以有多个线程执行,一个线程的执行可以认为一个CPU在执行这段程序,当有多个线程执行时可被视作多个CPU 在执行这个程序。
多线程被视作可以提升程序性能的一种很好的方式,但是相对于多任务,多线程带来了更多的挑战。同一个程序内部多个线程同一时刻执行,这就意味着他们同时读写内存,这样就会出现在单线程下不会产生的错误,而这些错误不会出现在单CPU 的计算机上,因为在单CPU 的计算机上,同一时刻,多个线程并不是真的都在执行,现代计算机有多核,甚至于有些计算机拥有多CPU,这就意味着不同的线程可以同时被不同的核或是不同的CPU 执行。
图片发自简书App
如果一个线程从内存区域读一个值的时候,另一个线程正在向内存区域写这个值的时候,那么读的线程最终会读到什么结果呢?原来的值?还是被另一个线程修改后的值呢?如果没有合适的保证措施,这些值都是有可能读到的。这种行为不可预知,结果可能随时都在变。因此,作为一个程序员,对正确对结果的预测是非常重要的!这就意味着程序员要学会怎么去控制线程对诸如内存、文件、数据库等这些共享资源的访问。
Java中的多线程和并发
Java 是让程序员很容易实现多线程的语言之一。java 自从开始之初就有多线程的能力,因此java 开发人员经常面对上面所说的问题。