黑马程序员技术交流社区

标题: 单例问题 [打印本页]

作者: ①人←①城市    时间: 2013-4-12 07:49
标题: 单例问题
本帖最后由 ①人←①城市 于 2013-4-13 17:14 编辑

单例在集群和分布式中的应用如何,怎样保持整个系统中只有一个单例?

作者: 王怀亮    时间: 2013-4-12 08:21
你的问题的前半部分我不清楚,后半部分,我知道:
单例模式常见的两种:懒汉式单例、饿汉式单例
一、懒汉式单例在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。
单例模式-懒汉式单例
  1. public class LazySingleton {
  2.         /*** 私有静态对象,加载时候不做初始化 */
  3.         private static LazySingleton m_intance = null;
  4.         /*** 私有构造方法,避免外部创建实例 */
  5.         private LazySingleton() {
  6.         }
  7.         /*** 静态工厂方法,返回此类的唯一实例.* 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */
  8.         synchronized public static LazySingleton getInstance() {
  9.                 if (m_intance == null) {
  10.                         m_intance = new LazySingleton();
  11.                 }
  12.                 return m_intance;
  13.         }
  14. }
复制代码
二、饿汉式单例在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
单例模式-饿汉式单例
  1. public class EagerSingleton{
  2.         /**私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象*/
  3.         private static final EagerSingleton m_instance = new EagerSingleton();
  4.         /*** 私有构造方法,避免外部创建实例 */private EagerSingleton(){}//提供了一个空的构造方法
  5.         /*** 静态工厂方法,返回此类的唯一实例.* @return EagerSingleton */
  6.         public static EagerSingleton getInstance(){
  7.                 return m_instance;
  8.                 }
  9.         }
复制代码

作者: ①人←①城市    时间: 2013-4-12 08:32
王怀亮 发表于 2013-4-12 08:21
你的问题的前半部分我不清楚,后半部分,我知道:
单例模式常见的两种:懒汉式单例、饿汉式单例
一、懒汉式 ...

谢谢你的回答了,虽然没有回答到点子上面,但还是谢谢你抽出时间来阅读这篇帖子.
作者: 王怀亮    时间: 2013-4-12 08:48
①人←①城市 发表于 2013-4-12 08:32
谢谢你的回答了,虽然没有回答到点子上面,但还是谢谢你抽出时间来阅读这篇帖子. ...

嘿嘿,不好意思,下次有幸为您解答问题,一定好好学习一下,努力做到更好
作者: 林声荣    时间: 2013-4-12 08:52
前面一个问题看不懂哈,嘿嘿、、、
怎样保持整个系统中只有一个单例?
针对你这个问题我也觉得挺抽象的,要在整个系统中保持只有一个单列,我理解应该不行吧,我们说的单列是指一个类在内存中只存在一个对象,而如果是有很多类,而且都保证它们在内存中只能存在一个对象岂不是有很多单列了、、、下面是我看视频时做的单列笔记,希望对你有用;
单例设计模式:解决一个类在内存中只存在一个对象。
  保证对象唯一的方式:
  1、为了避免其他程序过多建立该类对象,先禁止其他程序建立该对象;
  2、为了让其他程序可以访问的到该类对象,只好在本类中自定义一个对象;
  3、为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式;
  以上三步的代码的实现:
  将该类的构造函数私有化;
  在该类中创建一个本类对象;
  提供一个方法可以获取到该对象;
  如:class Single{                //饿汉式(一般开发都用,安全)
  private Single(){};
  private static Single s = new Single();
  public static Single getInstance(){
  return s;
  }
  }       
  
                        Class Single{                //懒汉式(不安全,当多个用户使用时,出现线程问题)
        private static Single  s = null;
        privarte Single(){};
        public static Single getInstance(){
                        if(s == null)  //线程问题
                                s= new Single();
                        return s;
        }
  class SingleDemo{
  Public static void main(String args[]){
  Single ss = Single.getInstance();
  }
  }
作者: 打工人    时间: 2013-4-12 23:18

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2