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 =
相关文档:
Flex在和java调用过程中,其实有更加灵活的办法来提高系统的敏捷度,极大提高系统的耦合和开发效率。在这里我继续给大家介绍一下,敏捷调用中的java动态代码调用。
先看java的类(BeanShell)这里主要是接收java代码来动态调用的
package com.shine.framework.be ......
JDK 6.0 以及JDK 5.0 update 9 的 nio支持epoll (仅限 Linux
系统
),对并发idle connection会有大幅度的性能提升,这就是很多网络服务器应用程序需要的。
启用的方法如下:
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider
例如在 Linux 下运行的 Tomcat 使用 NIO Connector ,那么启 ......
系统自动抛出的异常
所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。
语句抛出的异常
用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。
throw是语句抛出 ......
关于volatile
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。
这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下
volatile关键字的使用变得非常重 ......
package com.softeem.jbs.lesson4;
import java.util.Random;
/**
* 排序测试类
* 排序算法的分类如下:
* 1.插入排序(直接插入排序、折半插入排序、希尔排序);
* 2.交换排序(冒泡泡排序、快速排序);
* 3.选择排序(直接选择排序、堆排序);
* 4 ......