知识大全 Java线程模型缺陷研究[6]
Posted 知
篇首语:坚志而勇为,谓之刚。刚,生人之德也。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java线程模型缺陷研究[6]相关的知识,希望对你有一定的参考价值。
Java线程模型缺陷研究[6] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
访问的问题
如果缺少良好的访问控制 会使线程编程非常困难 大多数情况下 如果能保证线程只从同步子系统中调用 不必考虑线程安全(threadsafe)问题 我建议对 Java 编程语言的访问权限概念做如下限制 应精确使用 package 关键字来限制包访问权 我认为当缺省行为的存在是任何一种计算机语言的一个瑕疵 我对现在存在这种缺省权限感到很迷惑(而且这种缺省是 包(package) 级别的而不是 私有(private) ) 在其它方面 Java 编程语言都不提供等同的缺省关键字 虽然使用显式的 package 的限定词会破坏现有代码 但是它将使代码的可读性更强 并能消除整个类的潜在错误 (例如 如果访问权是由于错误被忽略 而不是被故意忽略) 重新引入 private protected 它的功能应和现在的 protected 一样 但是不应允许包级别的访问 允许 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 在每个构造函数中都有初始化 还是会出现这个错误信息 自从在 版本中引入内部类后 编译器中一直有这个错误 在此版本中(三年以后) 这个错误依然存在 现在 该是改正这个错误的时候了
对于类级域的实例级访问
除了访问权限外 还有一个问题 即类级(静态)方法和实例(非静态)方法都能直接访问类级(静态)域 这种访问是非常危险的 因为实例方法的同步不会获取类级的锁 所以一个synchronized static 方法和一个 synchronized 方法还是能同时访问类的域 改正此问题的一个明显的方法是 要求在实例方法中只有使用 static 访问方法才能访问非不变类的 static 域 当然 这种要求需要编译器和运行时间检查
由于f() 和 g() 可以并行运行 所以它们能同时改变 x 的值(产生不定的结果) 请记住 这里有两个锁 static 方法要求属于 Class 对象的锁 而非静态方法要求属于此类实例的锁
或则 编译器应获得读/写锁的使用
另外一种方法是(这也是一种理想的 方法) 编译器应 自动 使用一个读/写锁来同步访问非不变 static 域 这样 程序员就不必担心这个问题
cha138/Article/program/Java/gj/201311/27688相关参考
Java线程模型缺陷研究[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
Java线程模型缺陷研究[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
Java线程模型缺陷研究[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
Java线程模型缺陷研究[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
Java线程模型缺陷研究[7] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
Java线程/内存模型的缺陷和增强 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java在语言
Java语言深入多线程程序模型研究 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多线程是较复杂
Java线程模型如何完善相关的数据处理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java线
基于Java2运行时安全模型的线程协作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java
JavaSocket多线程如何支持服务器模型 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ja