下面的例子显示了一个奇怪的线程保存修改单吨模式,它也支持泛型。
让它只是线程保存和同步保存只需要同步块和瞬态和易失性关键字。 注意,有一个双重检查,同步块是在一个if中。这带来更多的性能,因为同步代价很高。
当然,对于一个真正的单身人士不使用地图,我说这是一个修改后的。
public class Edge<T> {
@SuppressWarnings({"unchecked"})
private static transient volatile HashMap<Object,HashMap<Object, Edge>> instances = new HashMap<Object, HashMap<Object,Edge>>();
/**
* This function is used to get an Edge instance
* @param <T> Datatype of the nodes.
* @param node1, the source node
* @param node2, the destination node
* @return the edge of the two nodes.
*/
@SuppressWarnings({"unchecked"})
public static <T> Edge<T> getInstance(T node1, T node2){
if(!(instances.containsKey(node1) && instances.get(node1).containsKey(node2))){
synchronized (Edge.class) {
if(!(instances.containsKey(node1) && instances.get(node1).containsKey(node2))){
Edge<T> edge = new Edge<T>(node1, node2);
if(!instances.containsKey(node1)){
instances.put(node1, new HashMap<Object, Edge>());
}
instances.get(node1).put(node2, edge);
}
}
}
return (Edge<T>)instances.get(node1).get(node2);
}
随机的例子,双重检查锁定不起作用,如果他同步他的getInstance方法,他不需要volatile关键字,transient与线程安全无关。双重检查锁定被破坏:http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html – 2011-03-17 14:54:29
一个ammendmant,当使用volatile(在java 5中)时,双重检查锁定会起作用。所以如果他确实使用了双重检查锁定,那么他会需要volatile关键字。 – 2011-03-17 15:14:09
那么为什么投我一票呢?这个例子就是天才。有点随机确定,但只是减少到需要的就可以做到这一点。如果你不知道这样的双重检查锁定工作,没有理由抱怨。 http://books.google.com/books?id=GGpXN9SMELMC&printsec=frontcover&dq=design+patterns&hl=de&ei=EFGCTbyaIozKswbHyaiCAw&sa=X&oi=book_result&ct=result&resnum=2&ved=0CDMQ6AEwAQ#v=onepage&q&f=false 退房第182页 – 2011-03-17 18:20:12