快速业务通道

Java线程模型缺陷研究 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
许 private private 语法指定“实现的访问”对于所有外部对象是私有的,甚至是当前对象是的同一个类的。对于“.”左边的唯一引用(隐式或显式)应是 this 。 扩展 public 的语法,以授权它可制定特定类的访问。例如,下面的代码应允许 Fred 类的对象可调用 some_method() ,但是对其它类的对象,这个方法应是私有的。

这种建议不同于 C++ 的 "friend" 机制。 在 "friend" 机制中,它授权一个类访问另一个类的所有 私有部分。在这里,我建议对有限的方法集合进行严格控制的访问。用这种方法,一个类可以为另一个类定义一个接口,而这个接口对系统的其余类是不可见的。

除非域引用的是真正不变(immutable)的对象或static final 基本类型,否则所有域的定义应是 private 。对于一个类中域的直接访问违反了 OO 设计的两个基本规则:抽象和封装。从线程的观点来看,允许直接访问域只使对它进行非同步访问更容易一些。

增加$property 关键字。带有此关键字的对象可被一个“bean 盒”应用程序访问,这个程序使用在 Class 类中定义的反射操作(introspection) API,否则与 private private 同效。 $property 属性可用在域和方法,这样现有的 JavaBean getter/setter 方法可以很容易地被定义为属性。

不变性(immutability)

由于对不变对象的访问不需要同步,所以在多线程条件下,不变的概念(一个对象的值在创建后不可更改)是无价的。Java 编程言语中,对于不变性的实现不够严格,有两个原因:对于一个不变对象,在其被未完全创建之前,可以对它进行访问。这种访问对于某些域可以产生不正确的值。 对于恒定 (类的所有域都是 final) 的定义太松散。对于由 final 引用指定的对象,虽然引用本身不能改变,但是对象本身可以改变状态。

第一个问题可以解决,不允许线程在构造函数中开始执行 (或者在构造函数返回之前不能执行开始请求)。

对于第二个问题,通过限定final 修饰符指向恒定对象,可以解决此问题。这就是说,对于一个对象,只有所有的域是 final,并且所有引用的对象的域也都是 final,此对象才真正是恒定的。为了不打破现有代码,这个定义可以使用编译器加强,即只有一个类被显式标为不变时,此类才是不变类。

有了$immutable 修饰符后,在域定义中的 final 修饰符是可选的。

最后,当使用内部类(inner class)后,在 Java 编译器中的一个错误使它无法可靠地创建不变对象。

既使空的 final 在每个构造函数中都有初始化,还是会出现这个错误信息。自从在 1.1 版本中引入内部类后,编译器中一直有这个错误。在此版本中(三年以后),这个错误依然存在。现在,该是改正这个错误的时候了。

对于类级域的实例级访问

除了访问权限外,还有一个问题,即类级(静态)方法和实例(非静态)方法都能直接访问类级(静态)域。这种访问是非常危险的,因为实例方法的同步不会获取类级的锁,所以一个synchronized static 方法和一个 synchronized 方法还是能同时访问类的域。改正此问题的一个明显的方法是,要求在实例方法中只有使用 static 访问方法才能访问非不变类的 static 域。当然,这种要求需要编译器和运行时间检查。

由于f() 和 g() 可以并行运行,所以它们能同时改变 x 的值(产生不定的结果)。请记住,这里有两个锁: static 方法要求属于 Class 对象的锁,而非静态方法要求属于此类实例的锁。

或则,编译器应获得读/写锁的使用:

另外一种方法是(这也是一种理想的 方法)-- 编译器应 自动 使用一个读/写锁来同步访问非不变 static 域,这样,程序员就不必担心这个问题。

后台线程的突然结束

当所有的非后台线程终止后,后台线程都被突然结束。当后台线程创建了一些全局资源(例

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号