最近在看JAVA方向的一些東西, 筆者這些年在C++, PHP, JAVA等面向對象的語言的使用中,有一些自己的體會。
語言是沒有好壞的, 只有使用的場合的合適與否。 沒有哪種語言說是可以完全取代別的語言的。
JAVA從出現到現在風靡全球, 有他道理的。
想的有點多的, 本文主要是針對在現在的項目中一個同事寫的Singleton模式對synchronized使用的一些自己的理解。
先上他寫的code,
public class DBConnPool{
private static DBConnPool instance = null;
public synchronized static DBConnPool getInstance() {
if (instance == null) {
try {
String modbase = System.getenv("DM_HOME");
modbase = modbase != null ? modbase : ".";
String dbcfg = modbase + File.separator + "conf" + File.separator + "dbcfg.xml";
instance = new DBConnPool(dbcfg);
} catch (Exception e) {
LOG.fatal("create connection pool instance failed", e);
}
}
return instance;
}
}
這裏就涉及到了對synchronized的使用,更多對synchronized的解釋可以參考筆者轉載文章
java synchronized詳解
。筆者比較推薦使用synchronized 塊而不是synchronized 方法。
public class Singleton{
private static volatile Singleton _instance;
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
這樣的話, 在多線程環境中, 對getInstance的訪問就不會被blocked, 而是僅當_instance爲null時, 需要創建時, 纔要block其他的線程。
這樣可以提高系統的效率。