<code>/*</code>
<code> </code><code>目的:分析一下單例設計模式中,懶漢式與餓漢式在多線程中的不同!</code>
<code> </code><code>開發時我們一般選擇餓漢式,因為它簡單明了,多線程中不會出現安全問題!</code>
<code> </code><code>而餓漢式需要我們自己處理程式中存在的安全隐患,但是餓漢式的程式技術含量更高!</code>
<code>*/</code>
<code>/* class SinglePerson implements Runnable{</code>
<code> </code><code>private static SinglePerson ss = new SinglePerson("hjz", 22);//惡漢式</code>
<code> </code><code>private int age;</code>
<code> </code><code>private String name;</code>
<code> </code><code>private int count;</code>
<code> </code><code>private SinglePerson(String name, int age){</code>
<code> </code><code>this.age = age;</code>
<code> </code><code>this.name = name;</code>
<code> </code><code>}</code>
<code> </code><code>private SinglePerson(){</code>
<code> </code><code>age = 10;</code>
<code> </code><code>name = " ";</code>
<code> </code><code>public static SinglePerson getInstance(){</code>
<code> </code><code>return ss;</code>
<code> </code><code>public String getName(){</code>
<code> </code><code>return name;</code>
<code> </code><code>public int getAge(){</code>
<code> </code><code>return age;</code>
<code> </code>
<code> </code><code>public void setIntroduceCount(){</code>
<code> </code><code>++count;</code>
<code> </code><code>public int getIntroduceCount(){</code>
<code> </code><code>return count;</code>
<code> </code><code>public synchronized void run(){</code>
<code> </code><code>ss.setIntroduceCount();</code>
<code> </code><code>try{</code>
<code> </code><code>Thread.sleep(20);</code>
<code> </code><code>}catch(InterruptedException e){</code>
<code> </code>
<code> </code><code>}</code>
<code> </code><code>System.out.println("this is " + ss.getName() + " " + ss.getAge() + " 被介紹的次數是:" + ss.getIntroduceCount());</code>
<code> </code><code>}</code>
<code>} */</code>
<code> </code><code>class</code> <code>SinglePerson </code><code>implements</code> <code>Runnable{</code>
<code> </code><code>private</code> <code>static</code> <code>SinglePerson ss = </code><code>null</code><code>;</code><code>//懶漢式</code>
<code> </code><code>private</code> <code>int</code> <code>age;</code>
<code> </code><code>private</code> <code>String name;</code>
<code> </code><code>private</code> <code>int</code> <code>count;</code>
<code> </code><code>private</code> <code>SinglePerson(String name, </code><code>int</code> <code>age){</code>
<code> </code><code>this</code><code>.age = age;</code>
<code> </code><code>this</code><code>.name = name;</code>
<code> </code><code>count=</code><code>0</code><code>;</code>
<code> </code><code>private</code> <code>SinglePerson(){</code>
<code> </code><code>age = </code><code>10</code><code>;</code>
<code> </code><code>name = </code><code>" "</code><code>;</code>
<code> </code><code>/*public static SinglePerson getInstance(){</code>
<code> </code><code>if(ss==null){//單例設計模式中,懶漢式在多線程中的缺憾啊!可能不能保證對象的唯一性</code>
<code> </code><code>try{</code>
<code> </code><code>Thread.sleep(10);</code>
<code> </code><code>}catch(InterruptedException e){}</code>
<code> </code><code>ss = new SinglePerson("hjz", 22);</code>
<code> </code><code>}</code>
<code> </code><code>}*/</code>
<code> </code><code>/* public static synchronized SinglePerson getInstance(){//保證了對象的唯一性,也就是安全性保證了!但是每當調用該函數時</code>
<code> </code><code>if(ss==null){ //都要判斷一下同步鎖對象,降低了程式的效率!</code>
<code> </code><code>} */</code>
<code> </code><code>public</code> <code>static</code> <code>SinglePerson getInstance(){</code><code>//這就是懶漢式的安全又效率的代碼!</code>
<code> </code><code>if</code><code>(ss==</code><code>null</code><code>){</code><code>//這一句是必須判斷的!</code>
<code> </code><code>synchronized</code><code>(SinglePerson.</code><code>class</code><code>){</code><code>//這一句隻是其他的線程通路時判斷</code>
<code> </code><code>if</code><code>(ss==</code><code>null</code><code>){</code>
<code> </code><code>try</code><code>{</code>
<code> </code><code>Thread.sleep(</code><code>10</code><code>);</code>
<code> </code><code>}</code><code>catch</code><code>(InterruptedException e){}</code>
<code> </code><code>ss = </code><code>new</code> <code>SinglePerson(</code><code>"hjz"</code><code>, </code><code>22</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>ss;</code>
<code> </code><code>public</code> <code>String getName(){</code>
<code> </code><code>return</code> <code>name;</code>
<code> </code><code>public</code> <code>int</code> <code>getAge(){</code>
<code> </code><code>return</code> <code>age;</code>
<code> </code><code>public</code> <code>void</code> <code>setIntroduceCount(){</code>
<code> </code><code>public</code> <code>int</code> <code>getIntroduceCount(){</code>
<code> </code><code>return</code> <code>count;</code>
<code> </code><code>public</code> <code>synchronized</code> <code>void</code> <code>run(){</code>
<code> </code><code>System.out.println(</code><code>"this is "</code> <code>+ ss.getName() + </code><code>" "</code> <code>+ ss.getAge() + </code><code>" 被介紹的次數是:"</code> <code>+ ss.getIntroduceCount());</code>
<code>}</code>
<code>class</code> <code>OtherThread </code><code>extends</code> <code>Thread{</code>
<code> </code><code>public</code> <code>void</code> <code>run(){</code>
<code> </code><code>SinglePerson.getInstance().run();</code>
<code>public</code> <code>class</code> <code>Test{</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args){</code>
<code> </code><code>new</code> <code>OtherThread().start();</code>
<code> </code><code>new</code> <code>Thread(SinglePerson.getInstance()).start();</code>
本文轉自 小眼兒 部落格園部落格,原文連結:http://www.cnblogs.com/hujunzheng/p/3876539.html,如需轉載請自行聯系原作者