快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

不变性(immutability)

由于对不变对象的访问不需要同步,所以在多线程条件下,不变的概念(一个对象的值在创建后不可更改)是无价的。Java 编程言语中,对于不变性的实现不够严格,有两个原因:

对于一个不变对象,在其被未完全创建之前,可以对它进行访问。这种访问对于某些域可以产生不正确的值。

对于恒定 (类的所有域都是 final) 的定义太松散。对于由 final 引用指定的对象,虽然引用本身不能改变,但是对象本身可以改变状态。

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

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

$immutable public class Fred    {      // all fields in this class must be final, and if the      // field is a reference, all fields in the referenced      // class must be final as well (recursively). static int x constant = 0; // use of `final` is optional when $immutable                    // is present.    }

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

最后,当使用内部类(inner class)后,在 Java 编译器中的一个错误使它无法可靠地创建不变对象。当一个类有重要的内部类时(我的代码常有),编译器经常不正确地显示下列错误信息:

"Blank final variable ''name'' may not have been initialized. It must be assigned a value in an initializer, or in every constructor."

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

对于类级域的实例级访问

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

class Broken    {      static long x; synchronized static void f()      {  x = 0;      } synchronized void g()      {  x = -1;      }    };

关于解决Java编程语言线程问题的建议(10)

时间:2011-01-24 Allen Holub

由于 f() 和 g() 可以并行运行,所以它们能同时改变 x 的值(产生不定的结果)。请记住,这里有两个锁: static 方法要求属于 Class 对象的锁,而非静态方法要求属于此类实例的锁。当从实例方法中访问非不变 static 域时,编译器应要求满足下面两个结构中的任意一个:

class Broken    {      static long x; synchronized private static accessor( long value )      {  x = value;      } synchronized static void f()      {  x = 0;      } synchronized void g()      {      accessor( -1 ); }    }

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

class Broken    {      static long x; synchronized static void f()     

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