在singleton中对synchronized的使用

WBOY
リリース: 2016-06-06 20:00:25
オリジナル
2269 人が閲覧しました

最近在看JAVA方向的一些东西, 笔者这些年在C, PHP, JAVA等面向对象的语言的使用中,有一些自己的体会。 语言是没有好坏的, 只有使用的场合的合适与否。 没有哪种语言说是可以完全取代别的语言的。 JAVA从出现到现在风靡全球, 有他道理的。 想的有点多的,

最近在看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;
	}

}
ログイン後にコピー


 

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其他的线程。

这样可以提高系统的效率。

 

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート