新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
第二个单例代码不严谨,可能会创建出多个实例。比如有两个线程同时访问getInstance(),当第一个线程进入synchronized块但还没有new的时候,第二个线程也走到if处,这个时候uniqueInstance =null,if返回true,第二个线程就进入了if块,但在synchronized块外面等待,然后第一个线程创建实例,第二个线程也能成功创建实例。
创新互联公司专注于南召企业网站建设,响应式网站,商城网站制作。南召网站建设公司,为南召等地区提供建站服务。全流程按需策划设计,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
不知道我说得够不够清楚。你可以看看《effective Java》这本书,里面有专门讲到这个问题。
单例模式:就是一个类仅创建一个对象;
public class Singleton {
private static volatile Singleton singleton = null;
private Singleton(){}// 构造方法
public static Singleton getSingleton(){// 单例模式
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
import java.util.Date;
public class Logger {
private static Logger instance;
private static Class clazz;
private Logger() {
}
private Logger(Class clazz) {
this.instance = new Logger();
this.clazz = clazz;
}
public static Logger getLogger(Class clazz) {
if (instance == null) {
synchronized (Logger.class) {
if (instance == null) {
instance = new Logger(clazz);
}
}
}
return instance;
}
public void info(String msg) {
System.out.println(clazz.getName() + "[" + new Date().toLocaleString()
+ "][info]:" + msg);
}
public void error(String msg) {
System.out.println(clazz.getName() + "[" + new Date().toLocaleString()
+ "][error]:" + msg);
}
public void warn(String msg) {
System.out.println(clazz.getName() + "[" + new Date().toLocaleString()
+ "][warn]:" + msg);
}
public void log(String msg) {
System.out.println(clazz.getName() + "[" + new Date().toLocaleString()
+ "][log]:" + msg);
}
public static void main(String args[]) {
Logger s = Logger.getLogger(String.class);
s.info("普通消息");
}
}