锁定老帖子 主题:关于JAVA单例模式
精华帖 (1) :: 良好帖 (2) :: 新手帖 (7) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-17
freish 写道 xuehua1987 写道 wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 Object smothing = null if(smothing == null) { // } 上面的代码会空指针?扯淡 String str = null; System.out.println(str.equals("")); //亲。这亲会报空指针吗? System.out.println("".equals(str)); //呐又这样呢? |
|
返回顶楼 | |
发表时间:2012-03-17
给你看看吧。希望能帮上。
public final class DataSourceUtil { private static DataSource dataSource; static { initDataSource(); } /** * 初始化数据源 * @throws ExceptionInInitializerError */ private static void initDataSource() throws ExceptionInInitializerError { try { Context context = new InitialContext(); dataSource = (DataSource) context.lookup("java:/comp/env/jdbc/mysql"); } catch (NamingException e) { throw new ExceptionInInitializerError(e); } } /** * 获得数据源 * @return */ public static DataSource getDataSource() { if (null == dataSource) { synchronized(dataSource) { if (null == dataSource) initDataSource(); } } return dataSource; } private DataSourceUtil() {} } |
|
返回顶楼 | |
发表时间:2012-03-18
jdk 1.5 以后, 使用enum最方便啦
public enum Singleton{ INSTANCE; //biz implements... //biz codes.. public static Singleton getInstance(){ return INSTANCE; } } |
|
返回顶楼 | |
发表时间:2012-03-18
洪帮主 写道 给你看看吧。希望能帮上。
public final class DataSourceUtil { private static DataSource dataSource; static { initDataSource(); } /** * 初始化数据源 * @throws ExceptionInInitializerError */ private static void initDataSource() throws ExceptionInInitializerError { try { Context context = new InitialContext(); dataSource = (DataSource) context.lookup("java:/comp/env/jdbc/mysql"); } catch (NamingException e) { throw new ExceptionInInitializerError(e); } } /** * 获得数据源 * @return */ public static DataSource getDataSource() { if (null == dataSource) { synchronized(dataSource) { if (null == dataSource) initDataSource(); } } return dataSource; } private DataSourceUtil() {} } equals 只是比较值是否相同 而==则是比较两个变量 是不是同一个变量,也应时是说 要看看这两个变量是不是引用的同一个地址, java 中只有引用地址相同的两个变量才被视为== 如果明白值传递与地址传递的话,这个问题应该不难理解 null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了 |
|
返回顶楼 | |
发表时间:2012-03-18
Fkron 写道 freish 写道 xuehua1987 写道 wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 Object smothing = null if(smothing == null) { // } 上面的代码会空指针?扯淡 String str = null; System.out.println(str.equals("")); //亲。这亲会报空指针吗? System.out.println("".equals(str)); //呐又这样呢? equals 只是比较值是否相同 而==则是比较两个变量 是不是同一个变量,也应时是说 要看看这两个变量是不是引用的同一个地址, java 中只有引用地址相同的两个变量才被视为== 如果明白值传递与地址传递的话,这个问题应该不难理解 null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了. 亲,这个问题要深层次的理解,要在程序运行时才可能出现的,你都一个变量显示的赋值了,当然不是空指针了. |
|
返回顶楼 | |
发表时间:2012-03-18
double check 也不是很靠谱,
现在我的做法都是,直接new 初始化 另外,楼主的写法确实有问题 每次return一个新实例,还能算是单例吗 |
|
返回顶楼 | |
发表时间:2012-03-18
string2020 写道 构造函数没有私有化。
同意,构造函数如果没有私有化的话,外部就可以通过构造函数来new对象,使得静态方法不是创造对象的唯一途径 |
|
返回顶楼 | |
发表时间:2012-03-18
xuehua1987 写道 Fkron 写道 freish 写道 xuehua1987 写道 wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 Object smothing = null if(smothing == null) { // } 上面的代码会空指针?扯淡 String str = null; System.out.println(str.equals("")); //亲。这亲会报空指针吗? System.out.println("".equals(str)); //呐又这样呢? equals 只是比较值是否相同 而==则是比较两个变量 是不是同一个变量,也应时是说 要看看这两个变量是不是引用的同一个地址, java 中只有引用地址相同的两个变量才被视为== 如果明白值传递与地址传递的话,这个问题应该不难理解 null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了. 亲,这个问题要深层次的理解,要在程序运行时才可能出现的,你都一个变量显示的赋值了,当然不是空指针了. 我自叹对不起我的小学语文老师。 明明开始说的并且一直说的都是 if(a==null)的问题,这与调用a上面的方法有毛线关系啊 |
|
返回顶楼 | |
发表时间:2012-03-18
多线程下可采用类加载程序,因为内部类只被加载一次,所以只会创建一个对象。
《设计模式解析-第二版》第21章有详细介绍 public class Singleton { private static class Instance { static final Singleton instance = new Singleton(); } private Singleton() { } public static Singleton getInstance() { return Instance.instance; } } |
|
返回顶楼 | |
发表时间:2012-03-18
freish 写道 xuehua1987 写道 Fkron 写道 freish 写道 xuehua1987 写道 wumingshi 写道 在多线程环境下有可能出现2个实例的情况。如果占用资源不大,可以直接在声明处创建,利用类加载的线程安全来保证;否则需要做一个sync。
另外,不要再用 if(null==smothing),应该if(something==null),这是几百年前的做法了,现代的编译器已经可以探测这样的错误了。 在表准的编程规范中应该是if(null==smothing)才正确 因为这样在程序中就可以避免空指针异常。 Object smothing = null if(smothing == null) { // } 上面的代码会空指针?扯淡 String str = null; System.out.println(str.equals("")); //亲。这亲会报空指针吗? System.out.println("".equals(str)); //呐又这样呢? equals 只是比较值是否相同 而==则是比较两个变量 是不是同一个变量,也应时是说 要看看这两个变量是不是引用的同一个地址, java 中只有引用地址相同的两个变量才被视为== 如果明白值传递与地址传递的话,这个问题应该不难理解 null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了. 亲,这个问题要深层次的理解,要在程序运行时才可能出现的,你都一个变量显示的赋值了,当然不是空指针了. 我自叹对不起我的小学语文老师。 明明开始说的并且一直说的都是 if(a==null)的问题,这与调用a上面的方法有毛线关系啊 if(a==null)调用了a的方法? Integer a = null;//这样赋值了就不是空指针了? |
|
返回顶楼 | |