请你写出一个单例模式来。 好,这个题目很简单,相信大家都能很快的写出来(写出来立即编译没有错误—当时去IBM面试时候的要求)。
请大家放心,面试官是不会就这么放过你滴。
会分别问你:怎么才能更节省资源?多线程情况下怎么样?双重检查方式的单例模式?还有其它的实现方式么? 一步步进逼,不会让你大喘气滴。 大家来试试,只要写出下面四种方式的就可以了:
A:单线程下单例模式;
B:简单修改A中代码,实现多线程下的单例模式;
C:双重检查的单例模式;
D:还有其它实现方式么?
来吧,大家come on!!!
请大家放心,面试官是不会就这么放过你滴。
会分别问你:怎么才能更节省资源?多线程情况下怎么样?双重检查方式的单例模式?还有其它的实现方式么? 一步步进逼,不会让你大喘气滴。 大家来试试,只要写出下面四种方式的就可以了:
A:单线程下单例模式;
B:简单修改A中代码,实现多线程下的单例模式;
C:双重检查的单例模式;
D:还有其它实现方式么?
来吧,大家come on!!!
private static ReadWriteTextFile rwt;
public static ReadWriteTextFile getRWT(){
if(null==rwt){
rwt=new ReadWriteTextFile();
}
return rwt;
}
}
Instance;
}这需要jdk比较新一些
....
}这样就行了,何必非得需要时才new呢?我只关注结果。现在内存那么便宜。
private static SingleTon singleTon = new SingleTon();
private SingleTon(){};
public static SingleTon getInstance() {
return singleTon;
}
}
private static SingleTon2 singleTon;
static {
singleTon = new SingleTon2();
}
private SingleTon2(){};
public static SingleTon2 getInstance() {
return singleTon;
}
}
private static SingleTon3 singleTon3 = null;
public synchronized SingleTon3 getInstance() {
if (singleTon3 == null) {
singleTon3 = new SingleTon3();
}
return singleTon3;
}
}
synchronized (instance) {
if (instance == null) {
instance = new XXX();
}
}
}
return instance;大概这么写 没写过 看人家差不多是这么写得双重检查是啥
要加上synchronized不然多线程是将得到的可能不是单例的,,,
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 上还有一种以静态内部类的实现
class S4 {
private S4() {
System.out.println("ok4");
}
private static class S4Holder {
static S4 instance = new S4();
}
public static S4 getInstance() {
return S4Holder.instance;
}
} 火龙果老大,能不能解释下这种静态内部类的原理?
public enum ReadWriteTextFile {
Instance;
public void annyMethod(){
}
}
还是这个好 单线程 多线程 以及双重检查都很安全 通过ReadWriteTextFile.Instance.annyMethod()
调用方法 简洁易懂什么的
INSTANCE;
public void leaceTheBuilding(){...}
}
<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>
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>