【发布时间】:2011-08-08 19:26:44
【问题描述】:
问题来了:
将单例设计模式实现为模板,这样,对于任何给定的类 Foo,您可以调用 Singleton::instance() 并获取指向单例实例的指针 Foo 类型。假设存在一个具有 acquire() 和 release() 的类 Lock 方法。如何使您的实现线程安全且异常安全?
我的分析:
正如 Joshua Bloch 在“有效的 java”中指出的那样,更好的实现方式 单例类是枚举和公共静态工厂方法。结合挥发性 和同步是我知道的使它线程安全和延迟初始化的方式 如下
public class myS{
private static volatile final _ins = null;
private myS(){};
public static myS getIns(){
synchronized(){
if(_ins==null) _ins = new myS();
}
return _ins;
}
}
此时,我对制作单例模板有点困惑。我的理解是我们要么有一个泛型类型的接口,要么有一个抽象类。只要客户端实现它们,它们就是单例的。所以,我的猜测解决方案如下:
public interface singleton<T>{
public T instance();
}
public class Foo implements singleton<T>{
private static volatile final Foo _ins = null;
public static Foo instance(){
synchronized(this)
if(_ins==null){
_ins = new Foo();
}
}
}
}
【问题讨论】:
-
你的
static instance()方法实际上并没有实现接口的instance()方法......这个代码和要求没有任何意义。而是研究抽象工厂和/或享元模式。 -
我很确定这不会编译。
-
人们一直在尝试这样做。虽然它确实保持单一职责并保持 Foo 类可测试,但所有消费类最终都与 Foo 紧密耦合。而是考虑使用 DI/IoC 容器框架。
-
如果这是作业,请标记它。否则,可能值得分享您为什么要这样做的动机,因为手动锁定强制执行的单例是……一个坏主意。
-
其他类如何返回单例类的实例?
标签: java multithreading design-patterns