java多线程学习总结.docx_第1页
java多线程学习总结.docx_第2页
java多线程学习总结.docx_第3页
java多线程学习总结.docx_第4页
java多线程学习总结.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java多线程学习总结【篇一:java多线程学习总结】 java多线程学习总结 1、 线程状态总的可分为五大状态:分别是生、死、可运行、运行、 等待/阻塞。 2、 thread.start()进入可运行状态; thread.sleep()进入睡眠状态; (1)wait()、notify()、notifyall()是三个定义在object类里的方法,可以用来控制线程的状态。 这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。 ? 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。 ? 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。 ? 如果对象调用了notifyall方法就会通知所有等待这个对象控制权的线程继续运行。 (2) 无论是执行对象的wait、notify还是notifyall方法,必须保证当前运行的线程取得了该对象的控制权(monitor),即锁住了该对象,获得了这个共享对象资源。这两个方法可用于线程的协作。 3、 thread.run()和thread.start()区别答:线程也是一个java对象,不要想得太神奇。 thread.run()普通方法调用,后面的代码需要等待run()方法的返回才可执行; thread.start()调用后,不用等待start()方法的返回,后面的代码就可执行。 4、 如何实现线程的复用? 答:不要让run()方法结束即可。线程池就是这么干的。将下面的true换成一个布尔变量你就可控制线程的结束了(执行完run()方法)。 public void run() while(true) 1、 不断从任务队列拿任务 2、 没有任务时,进入等待状态 参考博文: java多线程总结五:线程池的原理及实现 最简实例说明wait、notify、notifyall的使用方法 等等【篇二:java多线程与并发学习总结】 java多线程与并发学习总结 1.计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行;当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了。 缓存一致性:多处理器系统中,因为共享同一主内存,当多个处理器的运算任务都设计到同一块内存区域时,将可能导致各自的缓存数据不一致的情况,则同步回主内存时需要遵循一些协议。 乱序执行优化:为了使得处理器内部的运算单位能尽量被充分利用。 2.java内存模型 目标是定义程序中各个变量的访问规则。(包括实例字段、静态字段和构成数组的元素,不包括局部变量和方法参数) 1. 所有的变量都存储在主内存中(虚拟机内存的一部分)。 2. 每条线程都由自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。 3. 线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。 内存间交互操作: lock(锁定):作用于主内存中的变量,把一个变量标识为一条线程独占的状态。 read(读取):作用于主内存中的变量,把一个变量的值从主内存传输到线程的工作内存中。 load(加载):作用于工作内存中的变量,把read操作从主内存中得到的变量的值放入工作内存的变量副本中。use(使用):作用于工作内存中的变量,把工作内存中一个变量的值传递给执行引擎。 assign(赋值):作用于工作内存中的变量,把一个从执行引擎接收到的值赋值给工作内存中的变量。 store(存储):作用于工作内存中的变量,把工作内存中的一个变量的值传送到主内存中。 write(写入):作用于主内存中的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中。 unlock(解锁):作用于主内存中的变量,把一个处于锁定状态的变量释放出来,之后可被其它线程锁定。 规则: 1. 不允许read和load、store和write操作之一单独出现。 2. 不允许一个线程丢弃最近的assign操作,变量在工作内存中改变了之后必须把该变化同步回主内存中。 3. 不允许一个线程没有发生过任何assign操作把数据从线程的工作内存同步回主内存中。 4. 一个新的变量只能在主内存中诞生。 5. 一个变量在同一时刻只允许一条线程对其进行lock操作,但可以被同一条线程重复执行多次。 6. 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行read、load操作。 7. 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作。 8. 8. 对一个变量执行unlock操作前,必须先把该变量同步回主内存中。 3.volatile型变量 1. 保证此变量对所有线程的可见性。每条线程使用此类型变量前都需要先刷新,执行引擎看不到不一致的情况。 运算结果并不依赖变量的当前值、或者确保只有单一的线程修改变量的值。 变量不需要与其他的状态变量共同参与不变约束。1. 禁止指令重排序优化。普通的变量仅保证在方法执行过程中所有依赖赋值结果的地方都能获取到正确的结果。而不能保证赋值操作的顺序与程序代码中的顺序一致。 2. load必须与use同时出现;assign和store必须同时出现。 4.原子性、可见性与有序性 原子性:基本数据类型的访问读写是具备原子性的,synchronized块之间的操作也具备原子性。 可见性:指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。synchronized(规则8)和final可以保证可见性。final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把this的引用传递出去,那么在其他线程中就能看见final字段的值。 有序性:volatile本身包含了禁止指令重排序的语义,而synchronized则是由规则5获得的,这个规则决定了持有同一个所的两个同步块只能串行地进入。 5.先行发生原则 java内存模型中定义的两项操作之间的偏序关系,如果操作a先行发生于操作b,其实就是说在发生操作b之前,操作a产生的影响能被操作b观察到。 程序次序规则:在一个线程内,按照代码控制流顺序,在前面的操作先行发生于后面的操作。 管程锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。 volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作。 线程启动规则:thread对象的start()方法先行发生于此线程的每个操作。 线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测。 线程中断规则:对线程的interrupt()方法的调用先行发生于被中断线程的代码检测中断事件的发生。 对象终结过则:一个对象的初始化完成先行发生于它的finalize()方法的开始。传递性:如果操作a先行发生于操作b,操作b现象发生于操作c,那么就可以得出操作a先行发生于操作c的结论。 时间上的先后顺序与先行发生原则之间基本上没有太大的关系。 6.线程实现 使用内核线程实现: 内核线程kernel thread:直接由操作系统内核支持的线程,这种线程由内核类完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。 轻量级进程light weight process:每个轻量级进程都由一个内核线程支持。 局限性:各种进程操作都需要进行系统调用(系统调用代价相对较高,需要在用户态和内核态中来回切换);轻量级进程要消耗一定的内核资源,一次一个系统支持轻量级进程的数量是有限的。 使用用户线程实现: 用户线程:完全建立在用户空间的线程库上,系统内核不能直接感知到线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。所有的线程操作都需要用户程序自己处理。 混合实现: 将内核线程和用户线程一起使用的方式。操作系统提供支持的轻量级进程则作为用户线程和内核线程之间的桥梁。 sun jdk,它的windows版和linux版都是使用一对一的线程模型来实现的,一条java线程映射到一条轻量级进程之中。 7.线程调度 线程调度是指系统为线程分配处理器使用权的过程:协同式、抢占式。 协同式:线程的执行时间由线程本身控制,线程把自己的工作执行完了之后,要主动通知系统切换到另一个线程上。坏处:线程执行时间不可控制。 抢占式:每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。java使用该种调用方式。 线程优先级:在一些平台上(操作系统线程优先级比java线程优先级少)不同的优先级实际会变得相同;优先级可能会被系统自行改变。 8.线程状态 线程状态: 新建new: 运行runnable: 无限期等待waiting:等得其他线程显式地唤醒。 没有设置timeout参数的object.wait();没有设置timeout参数的thread.wait()。 限期等待timed_waiting:在一定时间之后会由系统自动唤醒。 设置timeout参数的object.wait();设置timeout参数的thread.wait();thread.sleep()方法。 阻塞blocked:等待获取一个排它锁,等待进入一个同步区域。 结束terminated: 9.线程安全【篇三:java多线程学习总结】 java多线程学习总结 一、线程的基本概念 简单的说:线程就是一个程序里不同的执行路径,在同一个时间点上cpu只会有一个线程在执行,java里的多线程是通过java.lang.thread类来实现的,每个线程都拥有自己独立的方法栈空间。 二、java线程的创建和启动 第一种 定义线程类实现runnable接口: thread mythread = new thread(target) /target为runnable接口类型 runnable中只有一个方法: public void run();用以定义线程运行体 第二种 可以定义一个thread的子类并重写其run方法: clas mythread extends thread public void run() 三、线程状态装换 调用线程start()方法时,线程进入就绪状态,cpu分配时间片,线程进入运行状态,时间片结束,run()方法未执行完,线程进入阻塞状态。 四、线程控制基本方法 isalive() /判断线程是否还“活着”,即线程是否还未终止 getpriority() /获得线程的优先级数值 setpriority() /设置线程的优先级指数 thread.sleep() /静态方法,将当前线程睡眠指定毫秒数 join() /调用某线程的该方法,将当前线程与该线程合并, /即等待该线程结束,再回复当前线程的运行。 yie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论