有意义的。class A { private A(){}// 将构造器变为私有。 A getA() { return new A(); } } 那么想要声明一个A就只能调用getA().
在这个类以外声明A时。使用A a = new A()是非法的。
回复人:hzalan() ( 一级(初级)) 信誉:100 2007-09-07 10:37:06 得分:0 ? 有意义的。class A { private A(){}// 将构造器变为私有。 A getA() { return new A(); } } 那么想要声明一个A就只能调用getA().----------------那你给讲讲,为什么要让人家只能用getA()?
class A { private A(){}// 将构造器变为私有。 A getA() { return new A(); } } 那么想要声明一个A就只能调用getA().----------------那你给讲讲,为什么要让人家只能用getA()?===============================================这个类没有构造了,外面怎么样才能调用 getA() 呢?又不是静态方法!
回复人:wuhaozhiyuan(飘) ( 二级(初级)) 信誉:100 2007-09-07 11:22:14 得分:0 ? 回复人:flyforlove(吾将远去) ( 一星(中级))麻烦给讲解一下为什么是陷阱, 这样写有什么不妥吗?------------------public A { private A() {} private static A a; public static getInstance() { if(a == null) { a = new A(); //当多个线程同时到达这个地方的时候。 } return a; } }出现上述情况,会创建多个不同实例,这种lazy模式在c#里可以使用double-check,但是在java里不适用。多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }
知道了多谢 flyforlove(吾将远去)
public A { private A() {} private static A a; public static getInstance() { if(a == null) { a = new A(); //当多个线程同时到达这个地方的时候。 } return a; } }能不能将 getInstance() 方法修改成 synchronized 的??
flyforlove(吾将远去) 的做法难道没有问题?多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }这个在多class loader的情况下,还是会有问题, 可以使用double-checking
在这个类以外声明A时。使用A a = new A()是非法的。 ---------------------------------------------- 我试了一下,调用完全合法
回复人:nihao955() ( 一级(初级)) 信誉:100 2007-09-07 11:47:22 得分:0 ? public A { private A() {} private static A a; public static getInstance() { if(a == null) { a = new A(); //当多个线程同时到达这个地方的时候。 } return a; } }能不能将 getInstance() 方法修改成 synchronized 的??---------------------------- 可以,不过在多线程情况下效率比较差。 回复人:bit1010(有色心没色胆,给我一瓶二锅头!) ( 二级(初级)) 信誉:100 2007-09-07 11:48:49 得分:0 ? flyforlove(吾将远去) 的做法难道没有问题?多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }这个在多class loader的情况下,还是会有问题, 可以使用double-checking------------------那你能不能告诉我,在多class loader的情况下,还要使用singleton?? 我上面说了,由于java的内存空间分配和C#不同,所以即使用dcl,也不安全。
在这个类以外声明A时。使用A a = new A()是非法的。 ---------------------------------------------- 我试了一下,调用完全合法 ----------------------------------------------private了。怎么调后面在说点什么是看不懂了,拜拜各位大虾
多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }=======================================我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。
回复人:bao110908(火龙果) ( 五级(中级)) 信誉:100 2007-09-07 12:32:22 得分:0 ? 多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }=======================================我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。 ---------- 说说你的办法。
flyforlove(吾将远去) 的做法难道没有问题?多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }这个在多class loader的情况下,还是会有问题, 可以使用double-checking=========================================================== 改一下: private static A a = null;public synchronized static getInstance() { if(a == null){ a = new A(); } return a; }这样会解决多线程问题
回复人:flyforlove(吾将远去) ( 一星(中级))多线程情况下,乖乖的这样用吧。 public A { private A() {} private static A a = new A(); public static getInstance() { return a; } }================================================上面用if(a==null)写的单例,是存在线程资源竞争的问题。但你这样写的单例还是存在缺陷的,也有比上面写法来的不好的地方:第一种单例写法能保证在getInstance()的时候,对象才会被创建,构造器内的代码才会被执行。而你的写法(大多数人的写法),对象创建是饥饿的,在ClassLoader加载类的时候就会创建。试想一下,在A的构造器里面需要用到一个参数static arg1,然后有个方法static setArg1(string)。当用户执行如下代码的时候将不会得到他想要的结果: A.setArg1(arg); A.getInstance();最好的单例写法是既没有线程竞争问题,对象创建方式又是Lazy的,参考一下我平时使用的Singletonpublic class Singleton { private Singleton() {}; private static class SingletonHolder { public final static Singleton instance = new Singleton(); } public Singleton getInstance() { return SingletonHolder.instance; } }
最好的单例写法是既没有线程竞争问题,对象创建方式又是Lazy的,参考一下我平时使用的Singletonpublic class Singleton { private Singleton() {};private static class SingletonHolder { public final static Singleton instance = new Singleton(); }public Singleton getInstance() { return SingletonHolder.instance; } }-------------------这个写法是谁写的?Bob Lee? 不过说起来,这个方法有脱裤子放屁之嫌,Singleton的作用就是拿到实例后使用,不会掺杂太多的东西。 如果你的Singleton需要这样调用 A.setArg1(arg); A.getInstance();那你应该检讨一下自己的设计了。
好巧啊,我的一个同学今天刚刚问了这个问题。本人向她解释了半天她没听懂。 现在好了,有这么多的解释。让她自己来看好了。 我同意楼上一位的观点:有意义的。class A { private A(){}// 将构造器变为私有。 A getA() { return new A(); } } 那么想要声明一个A就只能调用getA().
class A { private A(){}// 将构造器变为私有。 A getA() { return new A(); } } 那么想要声明一个A就只能调用getA(). ____________________________________不好意思,我想问一下,照这样写 getA() 这个方法在外部怎样才能调用呢?
...在这个类以外声明A时。使用A a = new A()是非法的。 ---------------------------------------------- 我试了一下,调用完全合法 ----------------------------------------------private了。怎么调后面在说点什么是看不懂了,拜拜各位大虾 ---------------------------------------------- lz的代码中那有private?在ide里编译一下就知道了
public class Singleton { private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 以上是NAS公司采用的单态模式(NEC下属公司)
回复人:zjf405(On№The①Road) ( 五级(中级)) 信誉:100 2007-09-12 13:02:52 得分:0 ? public class Singleton { private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 以上是NAS公司采用的单态模式(NEC下属公司)-------------这种写法的缺点上面已经说了,当然不管什么代码都有其应用场合。 有缺陷就是有缺陷,就算是sun公司在用,它还是有缺陷。
{
private A(){}// 将构造器变为私有。
A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA().
?
有意义的。class A
{
private A(){}// 将构造器变为私有。
A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA().----------------那你给讲讲,为什么要让人家只能用getA()?
{
private A(){}// 将构造器变为私有。
A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA().----------------那你给讲讲,为什么要让人家只能用getA()?===============================================这个类没有构造了,外面怎么样才能调用 getA() 呢?又不是静态方法!
?
控制创建对象,防止直接访问构造器----------------说话别说半截,为什么不要人家直接访问构造器???
class A
{
private A(){}// 将构造器变为私有。
static A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA()
?
Bruce Eckel说的,我前面刚看到,就搬上来了,,,------------------那你理解了么?你知道为什么要这样用么?
如果知道怎么回事了,再回过头看看我的第一个回帖。
private A() {}
private static A a; public static getInstance() {
if(a == null) {
a = new A();
}
return a;
}
}
?
如果使用的是 Singleton 的话,好像还少了点什么东西public A {
private A() {}
private static A a; public static getInstance() {
if(a == null) {
a = new A();
}
return a;
}
}
-------------千万别这样用,这是个陷阱。
这样写有什么不妥吗?
?
回复人:flyforlove(吾将远去) ( 一星(中级))麻烦给讲解一下为什么是陷阱,
这样写有什么不妥吗?------------------public A {
private A() {}
private static A a; public static getInstance() {
if(a == null) {
a = new A(); //当多个线程同时到达这个地方的时候。
}
return a;
}
}出现上述情况,会创建多个不同实例,这种lazy模式在c#里可以使用double-check,但是在java里不适用。多线程情况下,乖乖的这样用吧。
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}
private A() {}
private static A a; public static getInstance() {
if(a == null) {
a = new A(); //当多个线程同时到达这个地方的时候。
}
return a;
}
}能不能将 getInstance() 方法修改成 synchronized 的??
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}这个在多class loader的情况下,还是会有问题,
可以使用double-checking
----------------------------------------------
我试了一下,调用完全合法
?
public A {
private A() {}
private static A a; public static getInstance() {
if(a == null) {
a = new A(); //当多个线程同时到达这个地方的时候。
}
return a;
}
}能不能将 getInstance() 方法修改成 synchronized 的??----------------------------
可以,不过在多线程情况下效率比较差。
回复人:bit1010(有色心没色胆,给我一瓶二锅头!) ( 二级(初级)) 信誉:100 2007-09-07 11:48:49 得分:0
?
flyforlove(吾将远去) 的做法难道没有问题?多线程情况下,乖乖的这样用吧。
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}这个在多class loader的情况下,还是会有问题,
可以使用double-checking------------------那你能不能告诉我,在多class loader的情况下,还要使用singleton??
我上面说了,由于java的内存空间分配和C#不同,所以即使用dcl,也不安全。
顺便说下singleton模式的基本条件:
1.构造函数是私有的,意味着外界不能直接通过new的方式来创建该类的实例。
2.该类必须自己创建自身的唯一实例。
3.该类必须向外界提供访问唯一实例的接口。
在这个类以外声明A时。使用A a = new A()是非法的。
----------------------------------------------
我试了一下,调用完全合法
----------------------------------------------private了。怎么调后面在说点什么是看不懂了,拜拜各位大虾
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}=======================================我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。
?
多线程情况下,乖乖的这样用吧。
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}=======================================我不认为这样比较好,因为总有办法让 a 为 null 的。只要 a 为 null,那整个就没办法用了。
----------
说说你的办法。
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}这个在多class loader的情况下,还是会有问题,
可以使用double-checking===========================================================
改一下:
private static A a = null;public synchronized static getInstance() {
if(a == null){
a = new A();
}
return a;
}这样会解决多线程问题
* @see java.lang.String#valueOf(java.lang.Object)
* @see #append(java.lang.String)
*/
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}StringBuilder JDK 1.5 added /**
* @see java.lang.String#valueOf(java.lang.Object)
* @see #append(java.lang.String)
*/
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
super.append(str);
return this;
}
public A {
private A() {}
private static A a = new A(); public static getInstance() {
return a;
}
}================================================上面用if(a==null)写的单例,是存在线程资源竞争的问题。但你这样写的单例还是存在缺陷的,也有比上面写法来的不好的地方:第一种单例写法能保证在getInstance()的时候,对象才会被创建,构造器内的代码才会被执行。而你的写法(大多数人的写法),对象创建是饥饿的,在ClassLoader加载类的时候就会创建。试想一下,在A的构造器里面需要用到一个参数static arg1,然后有个方法static setArg1(string)。当用户执行如下代码的时候将不会得到他想要的结果:
A.setArg1(arg);
A.getInstance();最好的单例写法是既没有线程竞争问题,对象创建方式又是Lazy的,参考一下我平时使用的Singletonpublic class Singleton {
private Singleton() {}; private static class SingletonHolder {
public final static Singleton instance = new Singleton();
} public Singleton getInstance() {
return SingletonHolder.instance;
}
}
private Singleton() {};private static class SingletonHolder {
public final static Singleton instance = new Singleton();
}public Singleton getInstance() {
return SingletonHolder.instance;
}
}-------------------这个写法是谁写的?Bob Lee?
不过说起来,这个方法有脱裤子放屁之嫌,Singleton的作用就是拿到实例后使用,不会掺杂太多的东西。
如果你的Singleton需要这样调用
A.setArg1(arg);
A.getInstance();那你应该检讨一下自己的设计了。
A.setArg1(arg);
A.getInstance();那你应该检讨一下自己的设计了。======================================
Shark.config(propertiesFile); //load shark configute file for engine
Shark instance = Shark.getInstance(); 呵呵,无论你觉得这种使用方式好不好,但是不可否认这样写还是很常见的。自己代码不敢献丑了,我做工作流的,就随便摘一段Shark的源码供你参考。难道你不认为最后一种单例会更好一点?这些小的细节,能尽量写的完美一些不是更好么?比起原来的写法不只多了2、3行代码,不能说是“脱裤子放屁之嫌”
Shark instance = Shark.getInstance(); ----------------你是怎么保证多线程安全的????
Shark引擎只随服务启动一次,既:Shark.config(propertiesFile); //load shark configute file for engine
Shark instance = Shark.getInstance(); 这样的代码只在服务启动的时候执行一次,后面存在并发的时候只会有: Shark instance = Shark.getInstance(); 我们的讨论似乎跑题了,水了楼主的帖子@_@
?
你是怎么保证多线程安全的????============================
Shark引擎只随服务启动一次,既:Shark.config(propertiesFile); //load shark configute file for engine
Shark instance = Shark.getInstance();这样的代码只在服务启动的时候执行一次,后面存在并发的时候只会有:Shark instance = Shark.getInstance();我们的讨论似乎跑题了,水了楼主的帖子@_@---------------------如果是这样的话,使用上面你所述的方法就更加没有意义了,你只要使用个最简单的实现就可以了。
因为
你不用考虑多线程初始化问题。
现在好了,有这么多的解释。让她自己来看好了。
我同意楼上一位的观点:有意义的。class A
{
private A(){}// 将构造器变为私有。
A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA().
{
private A(){}// 将构造器变为私有。
A getA()
{
return new A();
}
}
那么想要声明一个A就只能调用getA().
____________________________________不好意思,我想问一下,照这样写 getA() 这个方法在外部怎样才能调用呢?
----------------------------------------------
我试了一下,调用完全合法
----------------------------------------------private了。怎么调后面在说点什么是看不懂了,拜拜各位大虾
----------------------------------------------
lz的代码中那有private?在ide里编译一下就知道了
private static Singleton instance = null;
private Singleton(){} public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
以上是NAS公司采用的单态模式(NEC下属公司)
?
public class Singleton {
private static Singleton instance = null;
private Singleton(){} public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
以上是NAS公司采用的单态模式(NEC下属公司)-------------这种写法的缺点上面已经说了,当然不管什么代码都有其应用场合。
有缺陷就是有缺陷,就算是sun公司在用,它还是有缺陷。