下面的例子顯示了一個奇怪的線程保存修改單噸模式,它也支持泛型。
讓它只是線程保存和同步保存只需要同步塊和瞬態和易失性關鍵字。 注意,有一個雙重檢查,同步塊是在一個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