java厉善信息-多线程-并发编程讲解

java厉善信息-多线程-并发编程讲解

ID:22583226

大小:402.69 KB

页数:25页

时间:2018-10-30

java厉善信息-多线程-并发编程讲解_第1页
java厉善信息-多线程-并发编程讲解_第2页
java厉善信息-多线程-并发编程讲解_第3页
java厉善信息-多线程-并发编程讲解_第4页
java厉善信息-多线程-并发编程讲解_第5页
资源描述:

《java厉善信息-多线程-并发编程讲解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java多线程并发编程一、多线程1、操作系统有两个容易混淆的概念,进程和线程。进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序H•数器、寄存器、堆栈和帧。同一进程屮的线程共川相同的地址空间,同时共享进进程锁拥有的内存和其他资源。2、Java标准库提供了进程和线程相关的API,进程主要包括表示进程的java.

2、lang.Process类和创建进程的java.Iang.ProcessBuilder类;表示线程的是java.Iang.Thread类,在虚拟机启动之G,通常只有Java类的main方法这个普通线程运行,运行时可以创建和启动新的线程;还有一类守护线程(damonthread),守护线程在后台运行,提供程序运行时所需的服务。当虚拟机中运行的所有线程都是守护线程时,虚拟机终止运行。3、线程间的可见性:一个线程对进程中共享的数据的修改,是否对另一个线程可见可见性问题:a、CPU采用时间片轮转等不同算法来对线程进行调度p

3、ublicclassIdGenerator{privateintvalue=0;publicintgetNext(){returnveilue++;对于IdGenerator的getNextO方法,在多线程下不能保证返回值是不重复的:各个线程之间相互竞争CPU吋间来获取运行机会,CPU切换可能发生在执行间隙。以上代码getNext()的指令序列:CPU切换可能发生在7条指令之间,多个getNext的指令交织在一起。1aload_02dup3getfield#124dupxl5iconstl6iadd7putfiel

4、d#12b、CPU缓存:R前CPU—般采用层次结构的多级缓存的架构,有的CPU提供了L1、L2和L3三级缓存。当CPU需要读取主存屮某个位賈的数据时,会一次检查各级缓存巾是否存在对应的数裾。如果有,直接从缓存屮读取,这比从主存中读取速度快很多。当CPU需要写入时,数据先被写入缓存中,之后再某个吋间点写回主存。所以某些时间点上,缓存中的数据与主存中的数据可能是不一致。c、指令顺序重排出行性能考虑,编译器在编译时可能会对字节代码的指令顺序进行重新排列,以优化指令的执行顺序,在单线程中不会有问题,但在多线程可能产生与可见

5、性相关的问题。二、Java内存模型(JavaMemoryModel)屏蔽了CPU缓存等细节,只关注主存中的共享变量;关注对象的实例域、静态域和数组元素;关注线程间的动作。1、volatile关键词:用来对共享变量的访问进行同步,上一次写入操作的结果对下一次读取操作是肯定可见的。(在写入volatile变量值之后,CPU缓存巾的内容会被写冋内存;在读取volatile变量时,CPU缓存中的对应内容会被置为失效,重新从主存中进行读取),volatile不使用锁,性能优于synchronized关键词。用来确保对一个变量

6、的修改被正确地传播到其他线程中。例子:A线程是Worker,一直跑循环,B线程调川setDone(true),A线程即停止任务1publicclassWorker{2privatevolatilebooleandone;3publicvoidsetDone(booleandone){4this,done=done;567891011publicvoidwork(){while(!done){//执行任务;例子:错误使用。因为没有锁的支持,volatile的修改不能依赖于当前值,当前值可能在其他线程中被修改。(Wor

7、ker是直接赋新值与当前值无关)2345publicvolatilestaticintcount=0;publicstaticvoidinc(){//这里延迟1毫秒,使得结果明显try{6Thread,sleep(1);7}catch(InterruptedExceptione){8}9count++;10}11publicstaticvoidmain(String[]args){12//同时启动1000个线程,去进行i++计算,看看实际结果13for(inti=0;i<1000;i++){14newThread(

8、newRunnable(){15©Override16publicvoidrun(){17Counter,inc();18}19}).start();20}21//这里每次运行的值都有可能不同,可能不为100022System,out.println(〃运行结果..Counter.count=〃+Counter,count);23}24}2、final关键词

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。