在singleton中對synchronized的使用

最近在看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其他的線程。

這樣可以提高系統的效率。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章