- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA的多线程浅析
JAVA的多线程浅析
随着操作系统对实现了对线程的支持,各种语言都加入了相应的功能,JAVA自然也不例外。本文将简要叙述线程的基本概念,并结合JAVA语言分析线程的调度和线程间的同步。
线程的基本概念
引入线程的目的主要是为了提高系统的执行效率,减少处理机的空转时间和调度切换的时间,便于系统管理。
线程是一个进程内的基本调度单位。 进程是资源分配的基本单位,也是处理机的调度单位,拥有一个完整的虚拟地址空间。而线程与资源分配无关,它属于一个进程,并与其他线程一起共享进程的资源和地址空间。线程只由相关堆栈寄存器和线程控制表组成。
进程切换时将涉及到有关资源指针的保存和地址空间的变化等问题,而同一进程内的线程由于共享资源和地址空间将不涉及这些问题,从而减少了操作系统的开销时间。
线程的调度
线程有两个基本类型: 用户级线程和系统级线程。用户级线程的调度是由操作系统提供的一个线程库来进行调度的,操作系统的内核只对进程进行管理。
一般有四种方法能使一个活动线程(如T1)放弃CPU。
同步 T1请求一个锁而得不到它,则放入队列等候,允 许另外的线程运行。
剥夺 一个高优先级的线程进入就绪状态
让出 该线程自动放弃
时间片 线程分时运行
JAVA中提供了10个优先级,从1到10。线程启动时默认是5,用户可以改变这个值。由于优先级的实现需要操作系统的强有力的支持,所以这个设置不一定有用。调度程序一般执行最高优先级的可运行线程,但并不能保证最高优先级总能运行。在JAVA中,线程的阻塞可能由以下几方面原因造成:
调用sleep(毫秒数),使线程进入睡眠状态。
用suspend()暂停了线程的执行。(不推荐使用)
用wait()暂停了线程的执行
线程正在等候一些IO操作完成
线程试图调用另一个对象的同步方法,但那个对象处于锁定状态,暂时无法使用。
系统级线程的调度是由内核来完成的。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行、撤销线程。
目前有些操作系统使用用户级线程,有的纯系统级线程如WINDOWS NT,有的则混合使用这两种线程如Solaris.
由于JAVA是用来编写适合于很多系统的可移植应用程序,所以它不能定义具体的线程结构和调度模型,而只能定义一个泛泛的模型由JVM去根据具体的操作系统去做实现。也就是说,JAVA本身只是定义了一些功能说明,而把其他的工作交给JVM去完成了,增加了JVM的工作量。
线程间的同步
多线程的引入必然带来线程间的同步问题。同步的方法有互斥锁、信号量、P.V操作、管程等。前三种方法需要用户的逻辑思维要相当清晰,否则极易造成死锁。而管程是对临界资源的使用进行统一的管理,程序员只需提交请求,而不必关心具体的使用,这就减少了死锁的可能性,降低了对程序员的要求,减少了程序的代码量。 但是管程只解决了资源共享的问题,而没有解决信息交换的。而且在系统中,每一种资源有一个管程,这就造成各种资源被独立调用的现象,但由于有些资源之间有着联系,可能在调用时发生很强的相互制约的现象,需要采取复杂的措施进行处理。
JAVA中每一个对象都有一个监控锁和一个条件队列。JAVA语言中定义了一个关键字synchronized用来实现互斥访问。被synchronized声明的方法为同步方法。在任何时刻,只可有一个线程执行特定对象的一个synchronized方法,在调用synchronized方法时,该对象就会被锁定,其他调用该对象的synchronized方法的线程会被阻塞,除非第一个方法完成了自己的操作。如果想保护其他某些资源不被多个线程同时访问,可以强制通过synchronized方法访问这些资源。另外,JAVA还提供了块同步。但要注意,当使用synchronized时要仔细划分代码段,否则会发生有一些代码永远不会执行的情况,如对线程中的run()设为synchronized,则这个对象中的其他同步方法在线程结束之前将无法被执行。对于条件同步,JAVA为每一个对象提供了三个方法: wait(), notify(),notifyall(). 这三个方法只能在synchronized方法或synchronized块中使用。其中调用wait()方法时,线程释放对象锁,而其他两个方法则不然。
JAVA的管程设计过于简单,这就导致了在进行复杂的同步设计时会导致大量的同步操作,从而性能的下降。而且在多个对象的同步过程中,容易造成死锁。下面简要叙述一下JAVA管程设计的缺点。第一点: JAVA的管程是没有优先级的。也就是说第一次想得到锁的线程和被notify的线程的地位是一样的。由于notify()和 notifyall()只是把等待
文档评论(0)