快速业务通道

关于解决Java编程语言线程问题的建议 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
还是假设的),但是实际的例子是非常多的:

class Stack {    LinkedList list = new LinkedList();    public synchronized void push(Object x)    {  synchronized(list)      {  list.addLast( x );        notify();      }    }    public synchronized Object pop()    {  synchronized(list)      {  if( list.size() <= 0 )          wait();        return list.removeLast();      }    } }

此例中,在 get() 和 put() 操作中涉及两个锁:一个在 Stack 对象上,另一个在 LinkedList 对象上。下面我们考虑当一个线程试图调用一个空栈的 pop() 操作时的情况。此线程获得这两个锁,然后调用 wait() 释放 Stack 对象上 的锁,但是没有释放在 list 上的锁。如果此时第二个线程试图向堆栈中压入一个对象,它会在 synchronized(list) 语句上永远挂起,而且永远不会被允许压入一个对象。由于第一个线程等待的是一个非空栈,这样就会发生死锁。这就是说,第一个线程永远无法从 wait() 返回,因为由于它占据着锁,而导致第二个线程永远无法运行到 notify() 语句。

在这个例子中,有很多明显的办法来解决问题:例如,对任何的方法都使用同步。但是在真实世界中,解决方法通常不是这么简单。

一个可行的方法是,在 wait() 中按照反顺序释放当前线程获取的 所有 锁,然后当等待条件满足后,重新按原始获取顺序取得它们。但是,我能想象出利用这种方式的代码对于人们来说简直无法理解,所以我认为它不是一个真正可行的方法。如果您有好的方法,请给我发 e-mail。

我也希望能等到下述复杂条件被实现的一天。例如:

(a && (b || c)).wait();

其中 a 、 b 和 c 是任意对象。

修改 Thread 类

同时支持抢占式和协作式线程的能力在某些服务器应用程序中是基本要求,尤其是在想使系统达到最高性能的情况下。我认为 Java 编程语言在简化线程模型上走得太远了,并且 Java 编程语言应支持 Posix/Solaris 的“绿色(green)线程”和“轻便(lightweight)进程”概念(在“( Taming Java Threads ”第一章中讨论)。 这就是说,有些 Java 虚拟机的实现(例如在 NT 上的 Java 虚拟机)应在其内部仿真协作式进程,其它 Java 虚拟机应仿真抢占式线程。而且向 Java 虚拟机加入这些扩展是很容易的。

一个 Java 的 Thread 应始终是抢占式的。这就是说,一个 Java 编程语言的线程应像 Solaris 的轻便进程一样工作。 Runnable 接口可以用于定义一个 Solaris 式的“绿色线程”,此线程必需能把控制权转给运行在相同轻便进程中的其它绿色线程。

例如,目前的语法:

class My_thread implements Runnable    {  public void run(){ /*...*/ }    } new Thread( new My_thread );

能有效地为 Runnable 对象产生一个绿色线程,并把它绑定到由 Thread 对象代表的轻便进程中。这种实现对于现有代码是透明的,因为它的有效性和现有的完全一样。

把 Runnable 对象想成为绿色线程,使用这种方法,只需向 Thread 的构造函数传递几个 Runnable 对象,就可以扩展 Java 编程语言的现有语法,以支持在一个单一轻便线程有多个绿色线程。(绿色线程之间可以相互协作,但是它们可被运行在其它轻便进程 ( Thread 对象) 上的绿色进程( Runnable 对象) 抢占。)。例如,下面的代码会为每个 runnable 对象创建一个绿色线程,这些绿色线程会共享由 Thread 对象代表的轻便进程。

new Thread( new My_runnable_object(), new My_other_runnable_object() );

现有的覆盖(override) Thread 对象并实现 run() 的习惯继续有效,但是它应映射到一个被绑定到一轻便进程的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号