Heim >php教程 >php手册 >在singleton中对synchronized的使用

在singleton中对synchronized的使用

WBOY
WBOYOriginal
2016-06-06 20:00:252313Durchsuche

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

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

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn