锁定老帖子 主题:为什么需要Singleton
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-08
首先要看看你的类是否需要其他oo特性,简单来说,一些工具类,如StringUtils等,不需要太多继承,也不需要其他继承等,那么就没有必要,就看你的是否需要。
另外,一般StringUtils是abstract final的,否则不能保证是单例,我可以直接new 一个出来(这是一个漏洞),参见spring的StringUtils。 |
|
返回顶楼 | |
发表时间:2009-06-08
最后修改:2009-06-08
楼主要注意多线程的问题
还有synchronized修饰的方法最好改成 用锁(ReentrantLock)的双判断模式效果会更好 package singleton; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Singleton { /** unique instance */ private static Singleton sInstance = null; /** static lock */ private static Lock lock = new ReentrantLock(); /** * Private constuctor */ private Singleton() { super(); } /** * Get the unique instance of this class. */ public static Singleton getUniqueInstance() { if (sInstance == null) { lock.lock(); //lock need times. try{ if(sInstance == null){ sInstance = new Singleton(); } }finally{ lock.unlock(); } } return sInstance; } //.. other code. } |
|
返回顶楼 | |
发表时间:2009-06-08
首先要看看你的类是否需要其他oo特性,简单来说,一些工具类,如StringUtils等,不需要太多继承,也不需要其他继承等,那么就没有必要,就看你的是否需要。
另外,一般StringUtils是abstract final的,否则不能保证是单例,我可以直接new 一个出来(这是一个漏洞),参见spring的StringUtils。 |
|
返回顶楼 | |
发表时间:2009-06-08
zhaomingzm_23 写道 楼主要注意多线程的问题
还有synchronized修饰的方法最好改成 用锁(ReentrantLock)的双判断模式效果会更好 package singleton; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Singleton { /** unique instance */ private static Singleton sInstance = null; /** static lock */ private static Lock lock = new ReentrantLock(); /** * Private constuctor */ private Singleton() { super(); } /** * Get the unique instance of this class. */ public static Singleton getUniqueInstance() { if (sInstance == null) { lock.lock(); //lock need times. try{ if(sInstance == null){ sInstance = new Singleton(); } }finally{ lock.unlock(); } } return sInstance; } //.. other code. } 你好 多线程问题很重要 为什么synchronized修饰的方法改成 用锁(ReentrantLock)的双判断模式效果会更好? synchronized 会引起线程不同步 或 效率问题吗 |
|
返回顶楼 | |
发表时间:2009-06-08
redhat 写道 首先要看看你的类是否需要其他oo特性,简单来说,一些工具类,如StringUtils等,不需要太多继承,也不需要其他继承等,那么就没有必要,就看你的是否需要。
另外,一般StringUtils是abstract final的,否则不能保证是单例,我可以直接new 一个出来(这是一个漏洞),参见spring的StringUtils。 AnotherSingleton 构造函数是 private 的,不能new出来 StringUtils 和 我这个类 有区别 StringUtils 没有内部状态,它就是把管局String的工具函数打包了 而 AnotherSingleton 是有内部状态的(私有静态属性)。 |
|
返回顶楼 | |
发表时间:2009-06-08
步行者 写道 zhaomingzm_23 写道 楼主要注意多线程的问题
还有synchronized修饰的方法最好改成 用锁(ReentrantLock)的双判断模式效果会更好 package singleton; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Singleton { /** unique instance */ private static Singleton sInstance = null; /** static lock */ private static Lock lock = new ReentrantLock(); /** * Private constuctor */ private Singleton() { super(); } /** * Get the unique instance of this class. */ public static Singleton getUniqueInstance() { if (sInstance == null) { lock.lock(); //lock need times. try{ if(sInstance == null){ sInstance = new Singleton(); } }finally{ lock.unlock(); } } return sInstance; } //.. other code. } 你好 多线程问题很重要 为什么synchronized修饰的方法改成 用锁(ReentrantLock)的双判断模式效果会更好? synchronized 会引起线程不同步 或 效率问题吗 这个问题就是效率问题了,你可以参考下jdk1.5 中ConcurrentHashMap 的文档注释,说的很详细。 |
|
返回顶楼 | |
发表时间:2009-06-08
redhat 写道 另外,一般StringUtils是abstract final的,否则不能保证是单例,我可以直接new 一个出来(这是一个漏洞),参见spring的StringUtils。
还有 abstract final 使不能通过编译的。 |
|
返回顶楼 | |
发表时间:2009-06-08
步行者 写道 redhat 写道 另外,一般StringUtils是abstract final的,否则不能保证是单例,我可以直接new 一个出来(这是一个漏洞),参见spring的StringUtils。
还有 abstract final 使不能通过编译的。 对于工具类限制有两种方法: 1.加abstract. 2.使构造函数变成private. 个人更推荐第二种方式. |
|
返回顶楼 | |
发表时间:2009-06-08
至于Singleton的同步问题DCL好象是有问题的,所以我推荐使用Bob Lee的Lazy写法:
public class NewSingleton { private static class SingletonHolder { static NewSingleton INSTANCE = new NewSingleton(); } public static NewSingleton getInstance() { return SingletonHolder.INSTANCE; } } |
|
返回顶楼 | |
发表时间:2009-06-08
kaka11 写道 至于Singleton的同步问题DCL好象是有问题的,所以我推荐使用Bob Lee的Lazy写法:
public class NewSingleton { private static class SingletonHolder { static NewSingleton INSTANCE = new NewSingleton(); } public static NewSingleton getInstance() { return SingletonHolder.INSTANCE; } } 应该加一个 private 构造器 |
|
返回顶楼 | |