/**
* 我觉得为了保证线程安全应该将return s;放入synchronized(){}的大括号内
*/
//懒汉式:延迟加载方式。
class Single {
// 构造函数私有化
private Single() {
}
// 先不创建对象
private static Single s = null;
// 定义一个方法可以获取到该对象
public static Single getInstance() {
// 方法被调用时才判断s是否为null,是否创建对象,起延时作用
if (s == null)
// 双重判断,加synchronized同步解决线程的安全问题
//-----ThreadA 与 ThreadB都为null,都在等待进入同步代码块
synchronized (Single.class) {
//假如ThreadA先进来了
if (s == null)
// 创建一个本类对象
s = new Single();
} //(1) // 如果ThreadA顺利执行完同步代码块并走到(1)处进入阻塞状态,而ThreadB进入同步代码块又重新
// new 了一个对象,这样有一个Thread不是做了无用功么
return s;
}
///////////////////////////////下面这样写会不会好点
/**
将第二个return放入synchronized (){}中就不会出现重复创建对象的操作,会不会好一点
*/
public class Single {
// 创建静态本类对象
private static Single s = null;
// 私有化构造方法
private Single() {
}
// 定义静态方法,返回本类对象实例
public static Single getInstance() {
if (s != null) {
return s;
}
synchronized (Single.class) {
if (s == null) {
s = new Single();
}
return s;
}
}
}
|
|