论坛首页 入门技术论坛

java关于单例模式的一些疑问?

浏览 15027 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-04-14   最后修改:2009-04-14
rrsy23 写道
单例 有没有想过用静态方法会怎么样?

用静态方法就是把方法声明成类的静态方法!在jvm装载这个类的时候会先转载它,并且全局共享。用类名.方法名()来访问。不知道你这么说是什么用意?或则你是怎么想的?
0 请登录后投票
   发表时间:2009-04-14  

“2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。”

没明白用这里的private Holder类能保证线程安全,莫非不这样做JDK就不去控制线程安全了么?

0 请登录后投票
   发表时间:2009-04-16  
Constructor的用法 和 static 的用法,如果不熟悉,可以用单例模式来加深对他们的理解。

单例模式的写法有很多吧,最简洁的才是最好的。

一个实例,虽然节约资源,缺点应该也很明显。就好比,厕所小便槽就一个,大家要排队等候。

0 请登录后投票
   发表时间:2009-04-16   最后修改:2009-04-16
看过这个一点点
Double-checked locking and the Singleton pattern
不过还是有点不明白

Out-of-order writes那段中

引用
public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {  //1
      if (instance == null)          //2
        instance = new Singleton();  //3
    }
  }
  return instance;
}


3.Thread 1 proceeds to //3 and makes instance non-null, but before the constructor executes.

In my opinion,the instance should be null before the constructor executes.

I'm confused about that.

Thanks
0 请登录后投票
   发表时间:2009-04-17  
一般认为在初始化时就指定好值是比较安全的,不能用时再初始化,虽然加上同步可以解决这个问题,但带来了额外的系统开销,不是好的解决方案
0 请登录后投票
   发表时间:2009-04-17  
lucane 写道
看过这个一点点

3.Thread 1 proceeds to //3 and makes instance non-null, but before the constructor executes.

In my opinion,the instance should be null before the constructor executes.

I'm confused about that.

Thanks


先获得实例目的就是不做同步的额外处理,你不能保证取得对象实例的时候没有并发,这样会产生多个实例,而不是单例了,所以使用才生成需要同步,会增加额外的工作
提前获得实例的好处就是把实例化的工作交给系统来干,能保证不需要同步也能保证单例的成功
0 请登录后投票
   发表时间:2009-04-18  
lucane 写道
看过这个一点点
Double-checked locking and the Singleton pattern
不过还是有点不明白

Out-of-order writes那段中

引用
public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {  //1
      if (instance == null)          //2
        instance = new Singleton();  //3
    }
  }
  return instance;
}


3.Thread 1 proceeds to //3 and makes instance non-null, but before the constructor executes.

In my opinion,the instance should be null before the constructor executes.

I'm confused about that.

Thanks

双重check的好处就是

如果只是像平时一样 每次判断都要先进性同步操作 性能会降低
因为线程不安全的场景 只是在 第一次创建的时候发生

而double check
先判断是否 已经实例化了 如果实例化了直接跳过同步部分
如果没有实例化 那么就做一次同步--判断--初始化的动作
两者的差距其实就那行没有同步锁的判断,这样再实例化以后所有的getIntanse就不必都要走 同步锁--判断--解锁的这个很浪费性能的流程而已- -
0 请登录后投票
   发表时间:2009-04-21  
本来不想注册 写道
Constructor的用法 和 static 的用法,如果不熟悉,可以用单例模式来加深对他们的理解。

单例模式的写法有很多吧,最简洁的才是最好的。

一个实例,虽然节约资源,缺点应该也很明显。就好比,厕所小便槽就一个,大家要排队等候。



兄台,您这个比喻好像不对吧..单例又不是单线程!
1 请登录后投票
   发表时间:2009-04-22   最后修改:2009-04-22
tangshd 写道
本来不想注册 写道
Constructor的用法 和 static 的用法,如果不熟悉,可以用单例模式来加深对他们的理解。

单例模式的写法有很多吧,最简洁的才是最好的。

一个实例,虽然节约资源,缺点应该也很明显。就好比,厕所小便槽就一个,大家要排队等候。



兄台,您这个比喻好像不对吧..单例又不是单线程!


所有线程都共享一个资源

一个线程共享所有资源


要是“资源”是马桶,排队的就是“线程”。

兄台为什么认为那位兄台比喻不对呢??
0 请登录后投票
   发表时间:2009-04-22  
C_J 写道
tangshd 写道
本来不想注册 写道
Constructor的用法 和 static 的用法,如果不熟悉,可以用单例模式来加深对他们的理解。

单例模式的写法有很多吧,最简洁的才是最好的。

一个实例,虽然节约资源,缺点应该也很明显。就好比,厕所小便槽就一个,大家要排队等候。



兄台,您这个比喻好像不对吧..单例又不是单线程!


所有线程都共享一个资源

一个线程共享所有资源


要是“资源”是马桶,排队的就是“线程”。

兄台为什么认为那位兄台比喻不对呢??


单例首要的条件就是线程安全,所以不会有线程公享资源的事情,何来资源一说?要是有资源公享的话,那还是单例吗?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics