Java线程模型缺陷研究 - 编程入门网
许 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |