<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    日出星辰

    2011年10月21日 #

    從需求開發會議談起

    今天項目組進行了一個小時的需求討論,由于剛進入項目組不久,對系統了解不多,幾乎沒有發言一直在旁聽。

    此次會議得出一點心得:系統開發中最重要的就是解決方案的敲定,解決方案選擇對的話,就算沒有達到事半功倍的效果,開發人員開發起來也能輕松很多。

    怎么才能產生一個好的解決方案,這就與對系統、需求、技術的掌握程度了,程度越高考慮事情越周全、解決方案越有效。

    由此也可以得出,企業在選擇員工時應該看重分析問題、解決問題的能力,而不是技術能力。當然了,技術能力一般,解決問題能力可能也不是多好。

    一個好的程序員:技術能力+解決問題能力(思維邏輯),所以技術是基礎、必備的,技術上要每天都有收獲,思維方式要時刻注意培養,不僅僅是解決開發問題時注意,日常生活同樣使用。

    posted @ 2011-10-21 23:19 日出星辰 閱讀(149) | 評論 (0)編輯 收藏

    2011年10月9日 #

    你的成功在于你每天養成的習慣

    要成功,就馬上準備有所付出吧!這就是每天你應該養成的習慣。 
    1、不說“不可能”; 
    2、凡事第一反應: 找方法,不找借口; 
    3、遇到挫折對自己說聲:太好了,機會來了! 
    4、不說消極的話,不落入消極的情緒,一旦發生立即正面處理; 
    5、凡事先訂立目標; 
    6、行動前,預先做計劃; 
    7、工作時間,每一分、每一秒做有利于生產的事情; 
    8、隨時用零碎的時間做零碎的事情; 
    9、守時; 
    10、寫點日記,不要太依靠記憶; 
    11、隨時記錄想到的靈感; 
    12、把重要的觀念、方法寫下來,隨時提示自己; 
    13、走路比平時快30%,肢體語言健康有力,不懶散、萎靡; 
    14、每天出門照鏡子,給自己一個自信的微笑; 
    15、每天自我反省一次; 
    16、每天堅持一次運動; 
    17、聽心跳一分鐘,在做重要的事情,疲勞時,緊張時,煩躁時。。。。 
    18、開會做前排; 
    19、微笑; 
    20、用心傾聽,不打斷對方的話; 
    21、說話有力,感覺自己的聲音能產生感染力的磁場; 
    22、說話之前,先考慮一下對方的感覺; 
    23、每天有意識贊美別人三次以上; 
    24、即使表示感謝,如果別人幫助了你的話; 
    25、控制住不要讓自己作出為自己辯護的第一反應; 
    26、不用訓斥、指責的口吻與別人說話; 
    27、每天做一件”分外事“; 
    28、不關任何方面,每天必須至少做一次”進步一點點“,并且有意識的提高; 
    29、每天提前15分上班,推遲30分下班; 
    30、每天下班前5分鐘做一下今天的整理工作; 
    31、定期存錢; 
    32、節儉; 
    33、時常運用”頭腦風暴“,利用腦力激蕩提升自己創新能力; 
    34、恪守誠信; 
    35、學會原諒。

    posted @ 2011-10-09 10:58 日出星辰 閱讀(180) | 評論 (0)編輯 收藏

    2011年10月8日 #

    數字轉換人民幣大寫

    通過JS完成,能滿足多種瀏覽器,不足之處是展示效果不是很理想,而且最多只能輸入13位數字,希望大家提出改正方法

    <html>
    <head>
    <title>數字轉換人民幣大寫</title>
    <script type="text/javascript">
    function convert() {
    var big = new Array("", "", "", "", "", "", "", "", "", "");
    var unit = new Array("", "", "", "", "", "", "", "", "", "",
    "", "", "");
    var num = document.getElementById("num").value;
    if (num =="") {
    alert(
    "輸入為空,請輸入數字");
    return false;
    }

    if (num.match(/[^,.\d]/) != null) {
    alert(
    "輸入內容不合法,請輸入數字");
    return false;
    }
    var temp = "";
    if (num != null&&num.length<=13) {
    for (var i = 0; i < num.length; i++) {
    if(num.charAt(i)==0){
    alert(
    "輸入內容不合法,不能以0開始");
    return false;
    }
    else{
    temp
    = temp + big[num.charAt(i)] + unit[num.length - i - 1];
    }

    }
    }
    else{
    alert(
    "最多只能輸入13位數字");
    return false;
    }
    document.getElementById(
    "rmb").innerText = temp;

    }


    </script>
    </head>

    <body>
    <input type="text" name="num" id="num"/>
    <input type="button" name="convert" value="轉換" onclick="return convert()"/>
    <input type="text" id="rmb"/>
    </body>
    </html>


     

     

    posted @ 2011-10-08 10:36 日出星辰 閱讀(189) | 評論 (0)編輯 收藏

    敲回車光標跳到下一個輸入框(只能在IE中使用)

    <html>
    <head>
    <title> 敲回車光標跳到下一個輸入框(只能在IE下使用) </title>
    </head>
    <script>
    function turnNext(object){
    if(object.keyCode==13){
    object.keyCode
    =9;
    }
    }
    </script>
    <body>
    <table>
    <tr>username<input type="text" name="name1" onkeydown="turnNext(event)"/></tr>
    <tr>password<input type="text" name="name2" /></tr>
    <tr>age<input type="text" name="name2" /></tr>
    </table>
    </body>
    </html>

    posted @ 2011-10-08 10:22 日出星辰 閱讀(281) | 評論 (0)編輯 收藏

    2011年9月30日 #

    各種文件注釋寫法

    JSP注釋

    在JSP中注釋最好用<%----注釋內容----%>

    JSP注釋分兩種

    顯示注釋:在客戶端(源代碼)可以看到

    HTML中的注釋<!---注釋內容--->  

    隱式注釋:在客戶端(源代碼)看不到

    使用JAVA中的“//”、“/*…………*/”,以及JSP中自己的注釋<%----注釋內容----%>

    <%---JSP中的注釋,看不見---%>

    <%

     //注釋,看不見 單行注釋

     /*

     XXXXX

     注釋,看不見  多行注釋

     YYYYY

    */

    %>

    <!----顯示注釋--->

    <!--This page was loaded on <%= (new java.util.Date()).toLocaleString() %> -->

    結果:<!--This page was loaded on 2010-12-01 13:24:32 -->

    如果用顯示注釋,瀏覽器也會執行里面的內容,速度會低點

    HTML注釋

    只有一種 <!----注釋內容-->

    <!----這里是HTML注釋--->

    XML注釋

    只有一種<!----注釋內容-->

    CSS注釋

    只有一種 /*  注釋內容 */

    JavaScript注釋

    單行注釋   //注釋內容

    多行注釋  

    /*

    XXXX

    注釋內容

    YYYY

    */

    posted @ 2011-09-30 15:52 日出星辰 閱讀(228) | 評論 (0)編輯 收藏

    2011年9月19日 #

    Struts1入門實例(簡單登錄)

    現在開始加入公司的核心項目,但由于項目開發比較早,所以使用的技術不是很新潮,前臺用的還是struts1。

    雖然不是什么新技術,但仍可以從中學到好多東西的。花了一個晚上的時間終于把struts1的流程跑通了。

    省略了創建過程及加入jar包的過程,直接進入正題。

    首頁要在web.xml中添加相應的struts配置:

    <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</param-value>
    </init-param>
    <init-param>
    <param-name>debug</param-name>
    <param-value>2</param-value>
    </init-param>
    <init-param>
    <param-name>detail</param-name>
    <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    然后在config所對應的目錄下添加struts配置文件struts-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"
    >

    <struts-config>

    <!-- ActionForm -->
    <form-beans>
    <!-- name:名稱 type:類路徑 -->
    <form-bean name="loginForm" type="com.login.LoginForm">
    </form-bean>
    </form-beans>
    <!-- 設置全局URL,必須寫在Action前面,這樣任何Action都可以使用 -->
    <global-forwards>
    <forward name="result" path="/result.jsp" />
    </global-forwards>

    <!-- 注冊Action -->
    <action-mappings>
    <!-- name:名稱 type:類路徑 path:客戶端(JSP)提交到服務器端時指定的路徑(Form表單中的action=”/login.do" -->
    <action path="/login" type="com.login.LoginAction"
    name
    ="loginForm" scope="request">
    <!-- 局部URL,只有這個action可以使用 -->
    <forward name="success" path="/success.jsp"></forward>
    <forward name="error" path="/error.jsp"></forward>
    </action>
    </action-mappings>


    </struts-config>
    
    
    注:Action和Form的關系是一個Action只能對應一個Form(通過Action的name屬性)
    而一個Form可以被多個Action調用
    LoginAction.java
    package com.login;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;

    public class LoginAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    LoginForm lf
    = (LoginForm) form;
    String username
    = lf.getUsername();
    String password
    = lf.getPassword();
    String errorInfo
    = "";
    String result
    = UserManager.getInstance().login(username, password);
    if (result.equals("success")) {
    request.setAttribute(
    "username", username);
    return mapping.findForward("success");
    }
    else if (result.equals("username")) {
    errorInfo
    = "密碼錯誤";
    }
    else {
    errorInfo
    = "用戶名錯誤";
    }
    request.setAttribute(
    "errorInfo", errorInfo);
    return mapping.findForward("error");
    }

    }
    LoginForm.java
    package com.login;

    import javax.servlet.http.HttpServletRequest;

    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;

    public class LoginForm extends ActionForm {

    private String username;
    private String password;

    public void reset(ActionMapping mapping, HttpServletRequest request) {
    System.out.println(
    "--------reset()-------------");
    super.reset(mapping, request);
    }

    public ActionErrors validate(ActionMapping mapping,
    HttpServletRequest request) {
    System.out.println(
    "--------validate()-------------");
    return super.validate(mapping, request);
    }

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }

    }
    對我個人來說最重要的是前臺jsp頁面沒有掌握,經常在頁面上花費很多時間
    在編寫JSP頁面時要用struts標簽,而我經常會忘記
    引入jsp標簽
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
    <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
    index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
    <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    	<head>
    		<title>首頁</title>
    	</head>
    
    	<body>
    		<html:form action="/login.do">
    			用戶名:<html:text property="username"></html:text><br/>
    			密碼: <html:password property="password"></html:password><br/>
    			<html:submit>submit</html:submit>
    		</html:form>
    	</body>
    </html>
    

     

    展示結果(將Action的返回值展示到JSP頁面上)

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
    <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    	<head>
    		<title>Error</title>
    	</head>
    	<body>
    		<bean:write name="errorInfo" scope="request" />
    	</body>
    </html>
    

     
     
    
    			
    			

    posted @ 2011-09-19 23:00 日出星辰 閱讀(141) | 評論 (0)編輯 收藏

    2011年9月14日 #

    Ant學習實例

    1.安裝Ant

    先從http://ant.apache.org/下載Ant,解壓到任一目錄下面,比如E:\Lab

    然后設置環境變量

    ANT_HOME=E:\Lab\apache-ant-1.8.2

    path=E:\Lab\apache-ant-1.8.2\bin

    最后驗證是否安裝成功

    在dos中輸入ant,如果顯示

    Buildfile: build.xml does not exist!
    Build failed

    則安裝成功

    2.基礎元素

    project元素

    project元素是Ant文件的根元素

    project的屬性

    Attribute

    Description

    Required

    name

    項目名稱

    No

    default

    當沒有指定target時使用的缺省target

    Yes

    basedir

    用于指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件文件的附目錄作為基準目錄。

    No

    target元素

    target為Ant的基本執行單元,它可以包含一個或多個具體的任務。多個target 可以存在相互依賴關系

    Ant會依照depends屬性中target出現的順序(從左到右)依次執行每個target。然而,要記住的是只要某個target依賴于一個target,后者就會被先執行。

    <target name="A"/>

    <target name="B" depends="A"/>

    <target name="C" depends="B"/>

    <target name="D" depends="C,B,A"/>

    假定我們要執行target D。從它的依賴屬性來看,你可能認為先執行C,然后B,最后A被執行。錯了,C依賴于B,B依賴于A,所以先執行A,然后B,

    然后C,最后D被執行。

    一個target只能被執行一次,即時有多個target依賴于它。

    若想更好的控制build過程,可以使用if或unless。

    if 屬性

        用于驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。

    unless 屬性

        該屬性的功能與 if 屬性的功能正好相反,它也用于驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。

    property元素

    property元素可看作參量或者參數的定義(即經常使用的變量),project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。

    name是變量的名稱 value是變量的值,要用某個變量時使用${name}方式調用。

    3.完整示例

    創建一個java項目

    HelloWorld.java

    package com.test;
    
    public class HelloWorld {
    	public static void main(String[] args) {
    		System.out.println("Hello world");
    	}
    }

    編寫build.xml文件

    注:build.xml放在和src同級目錄,而不是在src下級目錄

    目錄結構是

    MyProject <dir>
    |--lib <dir> --庫目錄
    |--classes <dir> --目的文件目錄
    |--src <dir> --源文件目錄
    |--doc <dir> --api文檔目錄
    |--build.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <project name="helloWorld" default="run" basedir=".">
    	<property name="src" value="src"/>
    	<property name="dest" value="build/classes"/>
    	<property name="lib" value="lib"></property>
    	<property name="hello_jar" value="hello1.jar"></property>
    	<!--初始化 之前執行刪除操作-->
    	<target name="init" depends="clean">
    		<mkdir dir="${dest}"/>
    	</target>
    	<!--編譯生成class文件 -->
    	<target name="compile" depends="init">
    		<javac srcdir="${src}" destdir="${dest}"></javac>
    	</target>
    	<!--將編譯后的class文件打包-->
    	<target name="build" depends="compile">
    		<mkdir dir="${lib}"/>
    		<jar jarfile="${lib}/${hello_jar}" basedir="${dest}"></jar>
    	</target>
    	<target name="run" depends="build">
    		<java classname="com.test.HelloWorld" classpath="${lib}/${hello_jar}"></java>
    	</target>
    	<!--刪除-->
    	<target name="clean">
    		<delete dir="${dest}"></delete>
    		<delete dir="${lib}"></delete><!-- 是dir 刪除目錄 ,不是file 刪除文件-->
    	</target>
    </project>
    整個過程:初始化----編譯----打包---放到相應的位置

    參考:

    http://www.cnblogs.com/philander/articles/1782254.html

    http://www.cnblogs.com/elric/archive/2011/03/19/1988840.html

    posted @ 2011-09-14 22:03 日出星辰 閱讀(195) | 評論 (0)編輯 收藏

    2011年9月8日 #

    請不要忘記,還有“思考”這個東西【轉】

    【轉自】http://www.cnblogs.com/tanky_woo/archive/2011/09/07/2169559.html

    最近準備參加實習生招聘,于是開始關注起了各大公司的面試題,在看網易面試題的時候看到了這么一題:

    為什么現在的計算機采用二進制?而不是八進制或十六進制?你認為以后的計算機會采用幾進制?

    我當時就在問自己,為什么?但是無果,我隱約記得很多書上都講過,但是為了追求速度,追求更重要的知識,我把這部分內容給自動濾過了。

    于是我又在想,是什么原因導致這樣的呢?

    我開始回憶我的學習過程,我發現,在大一大二開始接觸編程時,我還是很喜歡思考的,但是為何后來就麻木了呢?

    于是我又開始分析我的學習方法,沒錯,就是學習方法出問題了—我過于的追求速度,追求廣泛,很多知識,我都是一掃而過,很多代碼,我都是看一看就自以為懂了,曾經剛開始學時,我還經常把代碼往電腦上敲,把代碼抄在紙上,然而現在卻是直接掃一下。

    我想到了一個詞—物極必反。雖然我看的很多,看的很快,但是收效卻不大。

    我突然就被驚醒了,是的,捫心自問一下,現在記在我腦海里的,還有多少知識呢?你了解的知識多嗎?你看書仔細嗎?

    我相信很多人都和我一樣,為了應付考試,應付以后的面試,工作,都在瘋狂的看書,瘋狂的吸納知識,但是,你真的掌握了這些知識嗎?

    寫到這里的時候,我又想起來我昨天在伯樂在線看到的一篇文章:學一門語言,要了解他的歷史,哲學觀,這也是一種思考:

    比如文章中舉例的:拿python來說,他的設計哲學是“用一種方法,最好是只有一種方法來做一件事”,而perl的設計哲學是“總有多種方法來做同一件事”。

    其實,這是多么有趣的一件事,然后,就這樣被大部分人給忽略了。想到這,我都替自己感覺到可惜。

    幸好今天發現了這個問題,就像《讓子彈飛》里面說的一樣“步子要一步步的走,邁得大了,會扯著蛋”,確實,知識也要一步步的積累,沒有什么快速掌握的方法,最好的辦法就是一步一步的積累,要多思考,沒有思考,就沒有進步;沒有思考,就沒有升華。

    我們應該時刻要記住,學,應該是一種享受的過程,重點不在于結果,而是過程,一種發散思維的過程。

    希望自己能時刻記住這一點,能應付好接下來的實習生求職。

    注:上面那個問題的答案,大家可以相互交流下,我在網上找到這篇講的不錯:

    http://blog.csdn.net/hkx1n/article/details/4280036

    posted @ 2011-09-08 09:10 日出星辰 閱讀(142) | 評論 (0)編輯 收藏

    2011年9月7日 #

    IT草根職場必看【轉】

    前言:真實世界中的事情往往不是我們想象那么簡單的,軟件項目的復雜的業務也不是市面上的什么”精通,企業級”之類書籍能夠講述明白的。不要以為管理系統就是數據增刪改查,不要以為數據相差零點零幾就沒有什么。

    你要清楚:作為一個開發人員,你最值得驕傲的是什么,職業操守是什么。

         這里有一點需要的明白的是:公司為什么請你?說的直接一點,公司不是慈善機構,公司就是花錢請你來為她做事,創造價值的,一個不能創造價值的員工,公司會留你嗎?

        終于等到了上班的那天,我對任何人都珍惜今天的這個機會,因為沒有人知道,在此之前,我經歷了怎樣的艱辛。

        Leader給了我系統的整個數據字典(所有數據庫表的圖),說了一句:“理解所有表的關系,下午我給你講講系統的業務背景”。

         看到這里,有一點要告訴大家的是:不要再天真的以為公司會花幾個星期,幾個月的事情,讓你慢慢的熟悉業務,熟悉相關的知識,一切要靠自己去快速的領悟與消化,這是一個“物競天擇,能者居之”的社會,不是沒有誰就不行。

        說道這里,打個岔!同時這里給剛剛畢業或者踏入整個行業的朋友們提個醒:不要再以自己大學多么有名而驕傲,也不要再因為自己以前的成績多么的好而得以。一個人的學習能力就決定了他以后發展的深度和廣度。胸懷決定發展的高度!

         不要再以為有人會像老師那樣一行行的解釋代碼是什么意思,不要以為你是新人,犯錯就是“理所當然”。No excuse!

         在公司,我是最小的,周圍都是有幾年工作經歷的同事,還有四十多歲的。如果公司要裁人(在中國it),那么新人和年紀很大的就是目標群體(在你沒有核心競爭力和很好的人緣之前),新人是最大的目標!壓力!

         畢竟自己從大二就開始在外面兼職和實習,這點覺悟還是有的。所以,接到這第一個任務之后,自己開始行動起來。

         面對上百張數據表,無疑是個負責的蜘蛛網,怎么辦?那就得看你如何處理了。如果說,你要找人幫忙,也得“察言觀色”。下面,我們就細細說來。

         首先說如何理解上百張表,無疑,從系統的功能入手時最快速的。系統的功能一般是分模塊實現的,那么表勢必和相關的功能掛鉤,那么把表按照功能劃分來看,就很方便了。

         所以這里就告誡朋友們一點:要學會逆向思維。一直做項目的時候,總是先設計功能,讓后設計表,是吧!現在反推,從表到功能,再回到表,就能夠把問題變得簡單一點!不要以為這很簡單,我這里只是一個簡單的例子而已,如果問題更加復雜,怎么辦?!

         因為我是新人,計算機的權限有限,很多的資源都不能訪問,也沒有開通查看代碼的權限。但是,我現在需要可以運行的系統來幫助我,怎么辦?

    那么就涉及到第二個問題,如何找人幫忙?

         不要傻不拉幾的一上去就隨便找個人,然后開口說:“幫我一下“!要知道,人家憑什么幫你?人家有事情要忙嗎?這個世界沒有誰幫助誰是理所當然的!感激幫助過你的朋友和親人吧!

          所以,要學會“察言觀色“,這里不是貶義詞!做人要靈光點

          首先,最好請示leader,問他是否有時間?態度要好!如果沒有,那么就要問他,除了他還有誰可以問。

          當問另外一個人的時候,首先要觀察這個人是不是忙的那種不可開交的樣子,如果是,那么,現在最好不要問,而是自己再次評估一下,如果要找人幫忙,估計要花人家多長的時間?如何估算,這就是個人的本事了,呵呵!我這里暫且不說,免得又朋友說“你不說,我也知道“ !呵呵!

          然后,等自己這邊時間也估計好之后,然后態度很好的告訴你需要尋求幫助的人:“可以打擾你幾分鐘嗎“,然后,你就告訴他,你需要系統的一個可以運行的版本! 如果人家沒有時間,不要退縮,你就要追問,估計什么時候可以有時間,是否有文檔,先讓自己熟悉下。然后你就到那個點在再去問,不要忘記,隨時注意態度!

         不管如何,不要靠指望別人,要靠自己的一些經驗或相關文檔,盡力的理解。一句話,用心的,帶著腦子做事情!

    posted @ 2011-09-07 21:05 日出星辰 閱讀(140) | 評論 (0)編輯 收藏

    2011年9月5日 #

    各種創建單例模式的優缺點

    單例模式應用于一個類只有一個實例的情況,并且為其實例提供一個全局的訪問點。

    特點

    1.一個類只有一個實例

    2.自己創建這個實例

    3.整個系統只能用這個實例

    應用場景

    外部資源:每臺計算機有若干個打印機,但只能有一個PrinterSpooler,以避免兩個打印作業同時輸出到打印機。

    內部資源:大多數軟件都有一個(或多個)屬性文件存放系統配置,這樣的系統應該有一個對象管理這些屬性文件。

    實現方式

    1.餓漢式:單例實例在類裝載時就構建,急切初始化。(預先加載法)

    /**
     * 餓漢式(推薦)
     *
     */
    public class Singleton1 {
    
    	private Singleton1() {
    	}
    
    	public static Singleton1 instance = new Singleton1();
    
    	public Singleton1 getInstance() {
    		return instance;
    	}
    
    }

    優點 1.線程安全
    2.在類加載的同時已經創建好一個靜態對象,調用時反應速度快
    缺點 資源效率不高,可能getInstance()永遠不會執行到,但執行該類的其他靜態方法或者加載了該類(class.forName),那么這個實例仍然初始化

     

    2.懶漢式:單例實例在第一次被使用時構建,延遲初始化。

    class Singleton2 {
    	private Singleton2() {
    	}
    
    	public static Singleton2 instance = null;
    
    	public static Singleton2 getInstance() {
    		if (instance == null) {
                  //多個線程判斷instance都為null時,在執行new操作時多線程會出現重復情況
    			instance = new Singleton2();
    		}
    		return instance;
    	}
    }

    懶漢式在單個線程中沒有問題,但在多線程就可能會出現兩個或多個Singleton2實例情況,

    雖然后面實例化的Singleton2會覆蓋前面實例化的Singleton2,但最好避免這樣的情況。

    改進方式就是加鎖synchornized

    class Singleton3 {
    	private Singleton3() {
    	}
    
    	public static Singleton3 instance = null;
    
    	public static synchronized Singleton3 getInstance() {
    		if (instance == null) {
    			instance = new Singleton3();
    		}
    		return instance;
    	}
    }
    優點 資源利用率高,不執行getInstance()就不會被實例,可以執行該類的其他靜態方法
    缺點 第一次加載時不夠快,多線程使用不必要的同步開銷大


    3.雙重檢測

    class Singleton4 {
    	private Singleton4() {
    	}
    
    	public static Singleton4 instance = null;
    
    	public static Singleton4 getInstance() {
    		if (instance == null) {
    			synchronized (Singleton4.class) {
    				if (instance == null) {
    					instance = new Singleton4();
    				}
    			}
    		}
    		return instance;
    	}
    }

    優點 資源利用率高,不執行getInstance()就不被實例,可以執行該類其他靜態方法
    缺點 第一次加載時反應不快,由于java內存模型一些原因偶爾失敗

     

    4.靜態內部類

    class Singleton5 {
    	private Singleton5() {
    	}
    
    	private static class SingletonHelp {
    		static Singleton5 instance = new Singleton5();
    	}
    
    	public static Singleton5 getInstance() {
    		return SingletonHelp.instance;
    	}
    }

    優點 資源利用率高,不執行getInstance()不被實例,可以執行該類其他靜態方法
    缺點 第一次加載時反應不夠快

     

    總結:一般采用餓漢式(1),若對資源十分在意可以采用靜態內部類(4),不建議采用懶漢式及雙重檢測(2、3)

    另外

    對于第二種可以采用volatile方式

    volatile用更低的代價代替同步

    解釋:同步的代價主要有覆蓋范圍決定,如果可以降低同步的覆蓋范圍,可大幅提升性能。

    而volatile覆蓋范圍是變量級別的,因此同步代價很低。

    volatile原理:告訴處理器,不要將其放入工作內存,而是直接在主存操作。因此,當多處理器或多線程在訪問該變量時

    都將直接操作主存,這在本質上做到了變量共享。

    volation優勢:

    1.更大的程度吞吐量

    2.更少的代碼實現多線程

    3.程序伸縮性好

    4.比較好理解,無需太高的學習成本

    volatile不足:

    1.容易出問題

    2.比較難設計

    參考文獻

    http://yiminghe.iteye.com/blog/404334

    http://developer.51cto.com/art/201103/249322.htm

    posted @ 2011-09-05 21:54 日出星辰 閱讀(3384) | 評論 (0)編輯 收藏

    僅列出標題  下一頁
    主站蜘蛛池模板: 亚洲黄色一级毛片| 无码免费又爽又高潮喷水的视频| 国产大片线上免费看| 黄色视频在线免费观看| 亚洲伊人色一综合网| 亚洲国产精品人人做人人爽| 日韩精品无码专区免费播放| 成a人片亚洲日本久久| 久久精品国产亚洲av麻豆小说| 国产男女性潮高清免费网站| 久久久久久国产精品免费免费男同| 亚洲色成人四虎在线观看| 国产国拍亚洲精品mv在线观看 | 一个人看的免费视频www在线高清动漫| 亚洲AV无码久久| 国产免费黄色大片| 最近中文字幕大全免费视频| 免费看一级一级人妻片| 亚洲乱码中文论理电影| 亚洲午夜久久久影院| 国产成人免费福利网站| 中文免费观看视频网站| a毛片在线免费观看| 在线观看免费亚洲| 亚洲91精品麻豆国产系列在线| 亚洲综合国产一区二区三区| 永久在线毛片免费观看| 亚洲人成免费电影| 最好免费观看高清在线| 337p日本欧洲亚洲大胆人人| 亚洲中文字幕人成乱码| 亚洲AV福利天堂一区二区三| 亚洲日本va午夜中文字幕久久 | 亚洲精品中文字幕无码AV| 亚洲色自偷自拍另类小说| 免费观看午夜在线欧差毛片| 一个人在线观看视频免费| 中文字幕免费视频| 免费观看在线禁片| 最近中文字幕免费大全| 日本特黄特色AAA大片免费|