请你写出一个单例模式来。     好,这个题目很简单,相信大家都能很快的写出来(写出来立即编译没有错误—当时去IBM面试时候的要求)。
     请大家放心,面试官是不会就这么放过你滴。
     会分别问你:怎么才能更节省资源?多线程情况下怎么样?双重检查方式的单例模式?还有其它的实现方式么?    一步步进逼,不会让你大喘气滴。    大家来试试,只要写出下面四种方式的就可以了:
   A:单线程下单例模式;
   B:简单修改A中代码,实现多线程下的单例模式;
   C:双重检查的单例模式;
   D:还有其它实现方式么?
   来吧,大家come on!!!

解决方案 »

  1.   

    public class ReadWriteTextFile {

    private static ReadWriteTextFile rwt;
    public static ReadWriteTextFile getRWT(){
    if(null==rwt){
    rwt=new ReadWriteTextFile();
    }
    return rwt;
    }
    }
      

  2.   

    public enum ReadWriteTextFile {
    Instance;
    }这需要jdk比较新一些
      

  3.   

    static {
      ....
    }这样就行了,何必非得需要时才new呢?我只关注结果。现在内存那么便宜。
      

  4.   

    单例模式应该是只返回一次一个类的实例   static静态块如何返回一个类的实例呢  因为不能把所有代码方法都写在静态块里吧
      

  5.   

    public class SingleTon {
    private static SingleTon singleTon = new SingleTon();
    private SingleTon(){};

    public static SingleTon getInstance() {
    return singleTon;
    }
    }
      

  6.   

    class SingleTon2 {
    private static SingleTon2 singleTon;
    static {
    singleTon = new SingleTon2();
    }
    private SingleTon2(){};

    public static SingleTon2 getInstance() {
    return singleTon;
    }
    }
      

  7.   

    class SingleTon3 {
    private static SingleTon3 singleTon3 = null;

    public synchronized SingleTon3 getInstance() {
    if (singleTon3 == null) {
    singleTon3 = new SingleTon3();
    }
    return singleTon3;
    }

    }
      

  8.   

    if (instance == null) {
      synchronized (instance) {
        if (instance == null) {
          instance = new XXX();
        }
      }
    }
    return instance;大概这么写  没写过  看人家差不多是这么写得双重检查是啥
      

  9.   


    要加上synchronized不然多线程是将得到的可能不是单例的,,,
      

  10.   

    synchronized  我不懂什么双重检查
      

  11.   

    A:单线程下单例模式;public class Singleton {    private static Singleton instance;    private Singleton(){}    public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }B:简单修改A中代码,实现多线程下的单例模式;public class Singleton {    private static Singleton instance;    private Singleton(){}    public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }C:双重检查的单例模式;
    public class Singleton {    private static volatile Singleton instance;    private Singleton(){}    public static Singleton getInstance() {
            if (instance == null) {
                synchronized( Singleton.class ) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }D:还有其它实现方式么?
    public class Singleton {    private static Singleton instance = new Singleton();    private Singleton(){}    public static Singleton getInstance() {
            return instance;
        }
    }Effective Java 上还有一种以静态内部类的实现
      

  12.   

    另外,不要以为 new 一个对象是件很耗资源的事情,实际上并不是这样!
      

  13.   


    class S4 {     
        private S4() {     
            System.out.println("ok4");     
        }     
        
        private static class S4Holder {     
            static S4 instance = new S4();     
        }     
        
        
        public static S4 getInstance() {     
            return S4Holder.instance;     
        }     
    }    火龙果老大,能不能解释下这种静态内部类的原理?
      

  14.   

    上楼是说为么用静态内部类这种方式?好像和JVM相关
      

  15.   


    public enum ReadWriteTextFile {
        Instance;
        public void annyMethod(){
       
        }
    }
    还是这个好  单线程  多线程 以及双重检查都很安全  通过ReadWriteTextFile.Instance.annyMethod()
    调用方法 简洁易懂什么的
      

  16.   

    Java 1.5实现Singleton可以用包含一个元素的枚举类型。在其他的单类模式中如果进行序列化和反序列化那就不仅仅是一个对象了,effective java建议用户用Java 1.5的枚举类型进行编写单类,可避免序列化和反序列化引起的问题。public enum Singleton {
      INSTANCE;
      public void leaceTheBuilding(){...}
    }
      

  17.   

    解释的好啊  INSTANCE是大写的  我手打的打错了
      

  18.   

    关于这个问题。 在《JAVA与模式》一书中“单例模式” 那一章,你都可以找到答案
      

  19.   

    SGIP1.3的心跳 规范是什么呀?谁知道
      

  20.   

    SGIP1.3的心跳 规范是什么呀?谁知道
      

  21.   

    《effective Java》作者推荐用enum来实现单例。双检锁是有问题的The "Double-Checked Locking is Broken" Declarationhttp://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
      

  22.   

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <servlet>
            <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>        <init-param>
                <param-name>config</param-name>
                <param-value>
                    /WEB-INF/struts-config.xml,/WEB-INF/struts-config-lm.xml,/WEB-INF/struts-config-lm-basic.xml,/WEB-INF/struts-config-lm-onekey.xml,/WEB-INF/struts-config-lm-show.xml,/WEB-INF/struts-config-lm-output.xml,/WEB-INF/struts-config-wh.xml,/WEB-INF/struts-config-gxq.xml,/WEB-INF/struts-config-hbp.xml
                </param-value>
            </init-param>        <init-param>
                <param-name>debug</param-name>
                <param-value>3</param-value>
            </init-param>
            <init-param>
                <param-name>detail</param-name>
                <param-value>3</param-value>
            </init-param>
            <load-on-startup>0</load-on-startup>
        </servlet>
        <!-- init DateConverterServlet
       
        <servlet>
            <servlet-name>initSys</servlet-name>
            <servlet-class>com.asideal.util.InitSysServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet> -->
        <servlet>
            <servlet-name>initServlet</servlet-name>
            <servlet-class>com.asideal.util.InitServlet</servlet-class>
            <load-on-startup>3</load-on-startup>
        </servlet>
        <servlet>
            <servlet-name>initDicServlet</servlet-name>
            <servlet-class>com.asideal.util.InitDicServlet</servlet-class>
            <load-on-startup>4</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
        <!-- Date Export -->
        <servlet>
            <servlet-name>dataExport</servlet-name>
            <servlet-class>com.asideal.util.dataExport.DataExport</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>dataExport</servlet-name>
            <url-pattern>/dataExport</url-pattern>
        </servlet-mapping>
        <!-- webservice -->
        <!-- <servlet>
            <servlet-name>AxisServlet</servlet-name>
            <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
            </servlet>
            <servlet-mapping>
            <servlet-name>AxisServlet</servlet-name>
            <url-pattern>/services/*</url-pattern>
            </servlet-mapping>
        -->
        <servlet>
            <servlet-name>XFireServlet</servlet-name>
            <servlet-class>
                org.codehaus.xfire.transport.http.XFireConfigurableServlet
            </servlet-class>
        </servlet>
        <!-- 
            <servlet-mapping>
            <servlet-name>XFireServlet</servlet-name>
            <url-pattern>/servlet/XFireServlet/*</url-pattern>
            </servlet-mapping>
        -->
        <servlet-mapping>
            <servlet-name>XFireServlet</servlet-name>
            <url-pattern>/services/*</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
        <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.asideal.util.ScanFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <servlet>
            <servlet-name>showImgServlet</servlet-name>
            <servlet-class>com.asideal.util.ImgShowServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>showImgServlet</servlet-name>
            <url-pattern>/showImg</url-pattern>
        </servlet-mapping>
        
            <filter>
            <filter-name>uriFilter</filter-name>
            <filter-class>com.asideal.util.URIFilter</filter-class>
            <init-param>
            <param-name>redirectURL</param-name>
            <param-value>/page/util/UnLogin.jsp</param-value>
            </init-param>
            <init-param>
            <param-name>notCheckURLList</param-name>
            <param-value>
            /index.jsp,/page/util/UnLogin.jsp,/page/WSTest.jsp
            </param-value>
            </init-param>
            </filter>
            <filter-mapping>
            <filter-name>uriFilter</filter-name>
            <url-pattern>*.do</url-pattern>
            </filter-mapping>
            <!-- 
            <filter-mapping>
            <filter-name>uriFilter</filter-name>
            <url-pattern>/*</url-pattern>
            </filter-mapping>
        -->
        <!-- compareTimerListener 
            <listener>
            <listener-class>
            com.asideal.dao.tcompare.timer.CompareTimerListener
            </listener-class>
            </listener>
         -->
            <!-- 
            <servlet>
            <servlet-name>compareTaskThreadPoolInitServlet</servlet-name>
            <servlet-class>
            com.asideal.dao.tcompare.taskThread.CompareThreadPoolInitServlet
            </servlet-class>
            <load-on-startup>3</load-on-startup>
            </servlet>
         -->
        <!-- <error-page>
            <error-code>404</error-code>
            <location>/page/util/Error.jsp</location>
            </error-page>
            <error-page>
            <error-code>500</error-code>
            <location>/page/util/Error.jsp</location>
            </error-page> -->
    </web-app>
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC  "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <!-- Generated by MyEclipse Hibernate Tools. -->
    <hibernate-configuration>
        <session-factory>
            <property name="connection.username">output</property>
            <property name="connection.url">
                jdbc:oracle:thin:@192.168.0.222:1521:orcl
            </property>
            <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
            <property name="myeclipse.connection.profile">output</property>
            <property name="connection.password">output</property>
            <property name="connection.driver_class">
                oracle.jdbc.driver.OracleDriver
            </property>
            <property name="hibernate.connection.release_mode">auto</property>
            <property name="show_sql">true</property>
            <property name="query.factory_class">
                org.hibernate.hql.classic.ClassicQueryTranslatorFactory
            </property>        <!-- //ؔ¶¯¼쳩hqlԯ¾⟥nd -->
            <mapping resource="com/asideal/pojo/tbranch/TBranch.hbm.xml" />
            <mapping resource="com/asideal/pojo/tuser/TUser.hbm.xml" />
            <mapping resource="com/asideal/pojo/tbranch/TBranchCheck.hbm.xml" />
            <mapping resource="com/asideal/pojo/vbranch/VBranch.hbm.xml" />    </session-factory>
    </hibernate-configuration>
      

  23.   

    <%@ page language="java" pageEncoding="UTF-8"
        contentType="text/html;charset=UTF-8"%>
    <%@taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
    <%@taglib uri="/WEB-INF/struts-nested.tld" prefix="nested"%>
    <%@taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
    <%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
    <%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
            <title>хϢ²ꑯ±ȶՏµͳ</title>
            <meta http-equiv="pragma" content="no-cache">
            <meta http-equiv="cache-control" content="no-cache">
            <meta http-equiv="expires" content="0">
            <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
            <meta http-equiv="description" content="This is my page">
            <!-- 
            <link rel="StyleSheet" href="../../css/dtree.css" type="text/css" />
            <script type="text/javascript" src="./js/dtree.js"></script>
            <script type="text/javascript" src="./js/branch.js"></script> -->
            <script type="text/javascript">
                window.location.href='login.do';
            </script>
        </head>
        <body>
            <ol start="1">
                <li>
                    <html:link action="./branch.do">Branch</html:link>
                    <br>
                <li>
                    <html:link action="./query.do">Query</html:link>
                    <br>
                <li>
                    <html:link action="./user.do">ԃ»§</html:link>
                    <br>
                <li>
                    <html:link action="/role.do">½ȉ«</html:link>
                    <br>
                    <!-- 
            <html:link action="../page/query/QueryObjectList.jsp">Query_Objet</html:link>
            <a href="/page/query/object/QueryObjectList.jsp">_ query object _ </a>
             -->
                <li>
                    <html:link action="/menuAllAction.do">Menu</html:link>
                    <br>
                <li>
                    <html:link action="/compareList.do">±ȶԷ½°¸</html:link>
                    <br>
                <li>
                    <a href="page/login/UserLogin.jsp">µȂ¼</a>
                    <br>
                <li>
                    <html:link action="/toIndex.do">׷½脦</html:link>
                    <br>
                <li>
                    <html:link action="/showDataSource.do">˽¾ݹ݀׃</html:link>
                    <br>
                <li>
                    <html:link action="/showLogList.do">ɕ־²ꑯ</html:link>
                    <br>
                <li>
                    <html:link action="/userCheckList.do">ԃ»§ʳºɼ/html:link>
                    <br>
                <li>
                    <html:link action="/showST.do">ϵͳ·§ֵ</html:link>
                    <br>
                <li>
                    <html:link action="/menuCheck.do">²˵¥ʳºɼ/html:link>
                    <br>
            </ol>
        </body>
    </html>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
    <struts-config>
        <data-sources />
        <form-beans>
            <form-bean name="branchForm"
                type="com.asideal.struts.form.query.BranchForm" />
            <form-bean name="queryForm"
                type="com.asideal.struts.form.query.QueryForm" />
            <form-bean name="queryObjectForm"
                type="com.asideal.struts.form.query.QueryObjectForm" />
            <form-bean name="queryRestrictForm"
                type="com.asideal.struts.form.query.QueryRestrictForm" />  
        </form-beans>    <global-exceptions />
        <global-forwards />    <action-mappings>        <action attribute="branchForm" name="branchForm" path="/branch"
                type="com.asideal.struts.action.branch.BranchAction"
                validate="false">
                <set-property property="cancellable" value="false" />
                <forward name="success" path="/page/branch/BranchList.jsp" />
            </action>        <action attribute="branchForm" name="branchForm" path="/branchAll"
                scope="request"
                type="com.asideal.struts.action.branch.BranchAllAction"
                validate="false">
                <set-property property="cancellable" value="false" />
                <forward name="success" path="/page/branch/BranchList.jsp" />
            </action>        <action parameter="method" path="/queryBasicAddFlowComplete"
                type="com.asideal.struts.action.query.basic.addFlow.query.QueryBasicAddFlowCompleteAction"
                validate="false">
                <forward name="error" path="/page/util/Error.jsp" />
                <forward name="success" path="/queryBasicToDatasource.do" />
            </action>

        </action-mappings>
        <message-resources parameter="com.asideal.struts.ApplicationResources" />
    </struts-config>