志在指尖
用双手敲打未来

Java 并发编程简介

简介:
操作系统的呈现使得计算机每次能运转多个程序,并且不同的程序都在单独的进程中运转:操作系统为各个独立执行的进程分配好资源,包括内存,文件句柄以及平安证书等,在不同的进程之间能够经过一些粗粒度的通讯机制来交流数据,包括:套接字、信号处置器、共享内存、信号量以及文件等;一种高效的运转方式是经过粗粒度的时间分片(TimeSlicing)使这些用户和程序能共享计算机资源,而不是由一个程序从头到尾运转,在计算多个任务时,每个程序执行一个任务并在必要时互相通讯。
线程被称为轻量级进程,在大多数现代操作系统中,以线程为根本的调度单位,而不是进程,若没有明白的协同机制,那么线程将被彼此独立执行。线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器、栈以及部分变量等。由于同一个进程中的一切线程都将共享进程内存地址空间,因而这些线程都能访问系统的变量并在同一个堆上分配对象,这就需求完成一种比在进程间共享数据力度更细的数据共享机制,假如没有明白的同步机制来协同对共享数据的访问,那么当一个线程正在运用某个变量时,另一个线程可能同时访问这个变量,将形成不可预测的结果。Java 并发编程简介
优势:
效劳器应用程序在承受来自多个远程客户端的套接字衔接恳求时,若为每个衔接都分配其各自的线程并且运用同步I/O,会降低此类程序的开发难度。
若某个应用程序对套接字执行读操作而此时还没有数据到来,那么将不断阻塞,直到有数据到来。在单线程应用程序中,不只意味着在处置恳求的过程中将停顿,而且还意味着在这个线程被阻塞期间,对一切恳求的处置都将停顿,为防止此,单线程效劳器应用程序必需运用非阻塞I/O,而其复杂性要远远高于同步I/O,并且容易出错。但是,若每个恳求都有本人的处置线程,那么在处置某个恳求时发作的阻塞将不会影响其他恳求的处置。
风险:
1、平安性问题:
由于多个线程要共享相同的内存地址空间,并且是并发运转,因而它们可能会访问或修正其他线程正在运用的变量,招致结果是没有同步状况下,线程会由于无法意料的数据变化而发作错误。
假如没有同步,无论是编译器、硬件还是运转时,都能够随意布置操作的执行时间和次第,例如对存放器或者处置器中的变量停止缓存,而这些被缓存的变量关于其他线程来说是暂时(永世)不可见的。
@NotThreadSafe
publicclassUnsafeSequence{
privateintvalue;
publicintgetNext(){
returnvalue++;
}
}
事实上value++包含三个独立的操作:读取value,value+1,将计算结果写入value;
由于运转时多个线程之间的操作交替执行,因而可能同时执行读操作,从而得到相同值并将其加1,结果是,在不同线程的调用中返回相同的数值。
2、活泼性问题:
活泼性意味着某件正确的事情最终会发作,在串行程序中,即无限循环,从而使循环之后的代码无法得到执行,例如线程A在等候线程B释放其持有的资源,而线程B永远都不释放该资源,那么A就会永世地等候。
3、性能问题:
场景:在多线程程序中,当线程调度器暂时挂起活泼线程并转而运转另一个线程时,会频繁地呈现上下文切换操作,这种操作将带来极大的开支:保管和恢复执行上下文,丧失部分性,并且CPU时间将更多地花在线程调度而不是线程运转上;当线程共享数据时,必需运用同步机制,而这些机制常常会抑止某些编译器优化,使内存缓存区中的数据无效,以及增加共享内存总线的同步流量,都将带来额外性能开支。
场景解析:
当JVM启动时,将为JVM的内部任务(例,渣滓回收,终结操作等)创立后台线程,并创立一个主线程来运转main办法。
AWT和Swing:AWT和Swing的用户界面框架创立线程来管理用户界面事情。当用户动身某个UI动作时,在事情线程中就会有一个事情处置器被调用以执行用户恳求的操作,假如事情处置器需求访问由其他线程同时访问的应用程序状态(例如编辑某个文档),那么该事情处置器,以及访问这个状态的一切其他代码都必需采用一种线程平安方式来访问该状态。
Timer:Timer将创立线程来执行延迟任务。TimerTask将在Timer管理的线程中执行,若Task访问了其他线程访问的数据,那么Task需求以线程平安的方式来访问数据,其他类也必需采用线程平安的方式来访问该数据,完成该目的的最简双方式是将线程平安封装在共享对象内部确保Task访问的对象自身是线程平安。
Servlet和JavaServerPage:抵达效劳器的恳求会经过一个过滤器链被分发到正确的Servlet或JSP,当多个客户端同时恳求同一个Servlet效劳时或者Servlet被多个线程同时调用,则必需确保线程平安;即便确保只要一个线程调用某个Servlet,该Servlet可能会访问与其他多个Servlet共享的信息,例如保管在ServletContext中或者会话HttpSession中的对象,也必需正确协同对这些对象的访问完成线程平安。
远程办法调用(RMI,RMI可以调用在其他JVM中运转的对象):当调用远程对象时,将在一个由RMI管理的线程中调用该对象,同一个远程对象上的同一个远程办法会在多个RMI线程中被同时调用,因而必需正确协同在多个对象中共享的状态,以及对远程对象自身状态的访问(由于同一个对象可能会在多个线程中被同时访问),必需确保其本身的线程平安性。

未经允许不得转载:IT技术网站 » Java 并发编程简介
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载