最近在看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其他的线程。
这样可以提高系统的效率。