易截截图软件、单文件、免安装、纯绿色、仅160KB

JAVA并发编程笔记(3)

Publication and Escape 发布一个对象意味着能够从它能够从它当前范围之外被访问到。比如,保存可以被其他代码找到的这个对象的一个引用,或者将其作为一个非私有方法的返回值,或者将其作为参数传递给其它的类。 public static Set<Secret> knownSecrets;
public void initialize() {
knownSecrets = new HashSet<Secret>();
}
这个knownSecrets就被发布了,并且,knownSecrets里面添加的所有secret也都被发布出去了。
class UnsafeStates {
private String[] states = new String[] {
"AK", "AL" ...
};
public String[] getStates() { return states; }
}
这个states就被发布了,而且带来的问题是任何调用者都能够修改里面的内容,这样,很不安全。
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
看明白这个ThisEscape为什么被发布了么?因为它发布了EventListener,而内部类会带有一个隐式的对外部类的引用。
另外,上面这个类的一个严重问题是,在构造方法中this引用escape了。这也就意味着这个对象在被发布的时候还处于一个不完整的状态。一个常见的情形就是在类的构造方法中启动一个线程。When an object creates a thread from its constructor, it almost always shares its this reference with the new thread, either explicitly (by passing it to the constructor) or implicitly (because the Thread or Runnable is an inner class of the owning object). 当然这本身没什么问题,但最好不要在构造方法中就启动这个线程,而是把Thread.start()放到一个单独的init方法中供其它对象调用。
要避免不完全构造的问题,可以采用下面的方式:
public class SafeListener {
private final EventListener listener;
private SafeListener() {
listener = new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
};
}
public static SafeListener newInstance(EventSource source) {
SafeListener safe =


相关文档:

Java中throw和throws的区别

系统自动抛出的异常
所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。
语句抛出的异常
用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。
throw是语句抛出 ......

java 文件操作

1.
BufferedReader in = new BufferedReader(new FileReader("远程文件"));
in.readLine() ;
l  使用 Java 操作文本文件的方法详解
http://java.ccidnet.com/art/3737/20041108/523627_1.html
l    FileReader 是什么类?和 FileInputStream 有什么不同???     
ht ......

Java语言中的关键字讲解(三)volatile的用途

关于volatile
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。
这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下
volatile关键字的使用变得非常重 ......

Java中类的生命周期

  Java虚拟机管理类和对象的生命周期;
(1)类的生命周期从类被加载,连接,初始化开始,到类被卸载结束;
(2)类处于生命周期时,它的二进制数据位于运行时方法区内,在堆区还有一个相应的描述类的Class类的对象;
(3)只有当类处于生命周期中时,Java程序才能够使用它。
1.Java虚拟机及程序的生命周期
(1) ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号