Java 并发/多线程教程(一)

         本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!

        在早期,计算机只有一个CPU,同一时刻只能执行一个程序,后来有了多任务的说法,多任务是指计算机在同一时刻可以执行多个程序,但这并不是真正意义上的同一时刻,单个CPU 被多个程序共用,操作系统会在运行的运行的程序间相互切换。在相互切换之前会短暂的执行其中的一个。

      随着多任务的产生,给程序开发人员带来了新的挑战。程序不能再假定拥有所有的CPU 时间,不能再假定它拥有所有的内存空间和计算机的其他资源。一段好的程序应该释放掉不再使用的资源,以至于其他程序能够使用这些资源。再此之后又出现了多线程,这意味着在同一程序中可以有多个线程执行,一个线程的执行可以认为一个CPU在执行这段程序,当有多个线程执行时可被视作多个CPU 在执行这个程序。

     多线程被视作可以提升程序性能的一种很好的方式,但是相对于多任务,多线程带来了更多的挑战。同一个程序内部多个线程同一时刻执行,这就意味着他们同时读写内存,这样就会出现在单线程下不会产生的错误,而这些错误不会出现在单CPU 的计算机上,因为在单CPU 的计算机上,同一时刻,多个线程并不是真的都在执行,现代计算机有多核,甚至于有些计算机拥有多CPU,这就意味着不同的线程可以同时被不同的核或是不同的CPU 执行。

图片发自简书App

如果一个线程从内存区域读一个值的时候,另一个线程正在向内存区域写这个值的时候,那么读的线程最终会读到什么结果呢?原来的值?还是被另一个线程修改后的值呢?如果没有合适的保证措施,这些值都是有可能读到的。这种行为不可预知,结果可能随时都在变。因此,作为一个程序员,对正确对结果的预测是非常重要的!这就意味着程序员要学会怎么去控制线程对诸如内存、文件、数据库等这些共享资源的访问。

Java中的多线程和并发

  Java 是让程序员很容易实现多线程的语言之一。java 自从开始之初就有多线程的能力,因此java 开发人员经常面对上面所说的问题。

时间: 2024-09-20 12:33:13

Java 并发/多线程教程(一)的相关文章

Java 并发/多线程教程(五)-相同线程

       本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!        相同线程是一并发框架模型,是一个单线程系统向外扩展成多个单线程的系统.这样的结果就是多个单线程并行运行. 为什么是单线程系统?         你也许会感到好奇,为什么当今还有人设计单线程系统.单线程系统之所以这么普及,是因为单线程系统相对于多线程并发系统更为简单.单线程系统不需要与其他线程共享任何数据.这就使得单线程系统可以使用非并发的数据结构,可以更

Java 并发/多线程教程(十一)-JAVA内存模型

本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!         Java内存模型指定Java虚拟机如何与计算机的内存(RAM)一起工作.Java虚拟机是整个计算机的一个模型,所以这个模型自然包含了一个内存模型--也就是Java内存模型.         如果您想要设计正确的并发程序,那么理解Java内存模型是非常重要的.Java内存模型指定了不同线程如何以及何时可以看到由其他线程写入共享变量的值,以及在必要时如何同步访问共享变量

Java 并发/多线程教程(八)-竞态条件和临界区

      本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!       竞态条件是在临界区内可能发生的一种特殊情况.临界区是多线程并发执行一代码,根据线程的执行顺序可能产生多种结果的区域.多线程在临界区执行代码的结果可能不一样,不同的结果取决于线程的执行顺序.也就是说,临界区包含竞态条件.竞态一词源于隐喻,线程在临界区进进行资源竞争,在临界区的资源竞争影响最后的结果.      这听起来有点复杂,在下面的篇幅中,将会在下面的篇幅

Java 并发/多线程教程(十二)-JAVA同步块

本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 一个Java同步块标记一个方法或一个代码块作为同步.可以使用Java同步块来避免竞态条件. java同步关键字       在Java中同步的块被标记为Synchronized关键字.Java中的同步块在某些对象上是同步的.在同一对象上同步的所有同步块只能在同一时间内执行一个线程.所有试图进入同步块的其他线程都被阻塞,直到同步块中的线程退出该块. Synchronized关键字可以

Java 并发/多线程教程(七)-创建和启动java线程

      本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 创建和启动线程 在java中创建一个线程如下: Thread thread = new Thread(); 调用方法start()来启动一个线程: thread.start();         这个例子没有指定线程执行任何代码,线程将会在启动之后停止.         有两种方式指定线程应该执行什么代码.第一种方式就是创建一个Thread的子类并覆写run()方法.第

Java 并发/多线程教程(六)-并发VS并行

       本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!         在多线程线程编程中,我们经常提及并发和并行,但是并发和并行究竟是什么意思,他们所要表达是同一回事,还是不是同一加事.        它们当然不是一回事,虽然表面上它们看起来非常的相似,但是它们是两个不相同的术语.在此之前,我也花费了大量的时间去了解并发与并行的区别,因此我觉得在这里对比一下两者. 并发         并发意味着一个应用在同一时刻处理多

Java 并发/多线程教程(四)-并发模型

       本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平有限,不对之处还望矫正!        并发系统可以有多种并发模型来实现,并发模型指定线程如何协同完成分配给他们的任务.不同的并发模型以不同的方式划分任务,并且线程与线程之间以不同的方式进行通信和协作. 并发模型与分布式系统的相似性          本文中描述的并发模型类似于分布式系统中使用的不同体系结构.在并发系统中,不同

Java 并发/多线程教程(十)-线程安全及不可变性

本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!        只有在多个线程访问相同的资源时,才会出现竞态条件,并且一个或多个线对相同的资源进操作.如果多个线程读取相同的资源条件,就不会发生这种情况.        我们通过使共享变量不可以变来确保共享变量不被别的线程修改,因此这样的共享变量是线程安全的,下面有个例子: public class ImmutableValue{       private int value =

Java 并发/多线程教程(九)-线程安全和共享资源

         本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!       代码被多个线程同时调用是安全的,那么就称之为线程安全.如果一段代码是线程安全的,那么它没有竞态条件.竞态条件只有发生在多个线程更新共享资源.因些,清楚的知道线程执行时什么资源是共享的非常重要. 本地变量        本地变量存储在每个线程自己的栈里,这就意味着本地变量从不与其他线程共享.也就是说本地变量是线程安全的,下面是关于线程安全的本地变量的一个

Java 并发/多线程教程(三)-多线程的开销

        本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正!     应用程序由单线程到多线程,不仅仅给我带来了便利,同时也也带来了一些开销.不要因为你会多线程,就把所有的程序都设计成多线程.如果把单线程改成多线程,你获得到的好处要远远超过开销,对于这一点你应该有个清醒的认识.当你犹豫是应该用多线程还是单线程时,你要衡量性能和响应时间,而不是靠猜测. 更复杂的设计 尽管多线程应用程序的某些部分比单线程应用程序更简单,但其他部分