Re: [討論]國外軟體工程師與台灣的差別

看板Soft_Job作者 (魂縈夢牽)時間16年前 (2008/06/09 12:56), 編輯推噓7(7027)
留言34則, 5人參與, 最新討論串10/21 (看更多)
※ 引述《HYL (@Seattle)》之銘言: : ※ 引述《Harifucks (就是要戰腦殘保險業務)》之銘言: : : 對不起,既然R大提到singleton pattern,那順便請問技術問題。 : : 對於singleton pattern的存取,不是用static synchronized就可以解決了嗎? : : 還有什麼應該注意的,謝謝指導! : synchronized不是萬能,像是底下的code就不是thread safe... : class CustomerInfoFactory { : private static HashMap cMap = null; : public static synchronized Map getInstance(){ : if( cMap == null ) : cMap = new HashMap(); : return Map; : } : } 嘗試引述一下個人認為不是thread-safe的想法.. 照上面的code來看假設是想要提供一個 "Single instance to serve Multi threads." import java.util.Map; public class Th1 extends Thread { private Map m; public Th1(Map m){ this.m=m; } public void run(){ System.out.println("@Th1 ... s is :" + (String)m.get("s")); } } public class Th2 extends Thread { private Map m; public Th2(Map m){ m.put("s", "hello2"); this.m=m; } public void run(){ System.out.println("@Th2 ... s is :" + (String)m.get("s")); } } public class Cool { public static void main(String[] args) { Map m = CustomerInfoFactory.getInstance(); m.put("s", "hello1"); Thread t1 = new Th1(m); //t1.run(); t1.start(); Thread t2 = new Th2(m); t2.start(); // t1.run(); } } ==================================== 根據上述的測試結果如下 @Th1 ... s is :hello1 @Th2 ... s is :hello2 @Th1 ... s is :hello2 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.111.46

06/09 23:38, , 1F
那原程式要怎麼修改才能變成Thread-Safe?
06/09 23:38, 1F

06/10 00:15, , 2F
Google "how to kill singleton"
06/10 00:15, 2F

06/10 09:37, , 3F
這種專教 thread 的章節,應該都會提,
06/10 09:37, 3F

06/10 09:38, , 4F
不同語言會有不同語法,但大約都是那幾種
06/10 09:38, 4F

06/10 09:39, , 5F
基本上不是 singleton 有問題,
06/10 09:39, 5F

06/10 09:39, , 6F
而是寫 thread 的人,對 thread 不熟,才會誤用都不知道.
06/10 09:39, 6F

06/10 09:41, , 7F
這年頭,懶得買書來看的,好像越來越多.
06/10 09:41, 7F

06/10 09:41, , 8F
應該是說懶得看書啦. 圖書館有免費的,經典書籍通常會有.
06/10 09:41, 8F

06/10 09:43, , 9F
有的連 網路搜尋都很少在用.
06/10 09:43, 9F

06/10 12:44, , 10F
我沒記錯的話! Thread 不是要用 start() 來開始?
06/10 12:44, 10F

06/11 09:26, , 11F
看一下這個api說明吧
06/11 09:26, 11F

06/11 09:26, , 12F
Causes this thread to begin execution;
06/11 09:26, 12F

06/11 09:26, , 13F
the Java Virtual Machine calls the run method of
06/11 09:26, 13F

06/11 09:27, , 14F
this thread.
06/11 09:27, 14F

06/11 13:12, , 15F
我想表達的是
06/11 13:12, 15F

06/11 13:13, , 16F
若直到呼叫run(),就變成單純呼叫物件上的方法.
06/11 13:13, 16F

06/11 13:14, , 17F
而不是多線程(Thread)的並行行為.
06/11 13:14, 17F

06/11 13:15, , 18F
而是樓主本來就只想要建立兩個物件然後輪流呼叫
06/11 13:15, 18F

06/11 13:15, , 19F
它們的run().
06/11 13:15, 19F

06/11 13:16, , 20F
所以上述main的程式碼我看到的次序
06/11 13:16, 20F

06/11 13:17, , 21F
應該永遠是 t1.run()->t2.run()->t1.run()
06/11 13:17, 21F

06/11 13:18, , 22F
依序執行 而非 多線程的執行方式.
06/11 13:18, 22F

06/11 13:27, , 23F
關於樓主回覆API中說明文字:
06/11 13:27, 23F

06/11 13:28, , 24F
我認為應該是指 多線程要透過 start()呼叫run()來啟動!
06/11 13:28, 24F

06/11 13:29, , 25F
而start()也只能被呼叫一次! 否則會發生執行期錯誤!
06/11 13:29, 25F

06/11 13:30, , 26F
不知這樣解釋是否有讓樓主知道我在問什麼?
06/11 13:30, 26F

06/11 13:31, , 27F
我想知道樓主直接呼叫run()的理由!
06/11 13:31, 27F

06/11 13:32, , 28F
是誤用?
06/11 13:32, 28F

06/11 13:32, , 29F
還是要解釋ThreadSafe行為?(若是此情況我就看不懂code)
06/11 13:32, 29F

06/11 13:42, , 30F
多謝tangblack說明,其實我上述的api說明原本只是要說
06/11 13:42, 30F

06/11 13:43, , 31F
start()會呼叫run()而已,但確實是真的應該要用start()才能
06/11 13:43, 31F

06/11 13:44, , 32F
真正達成多線程處理..感謝指正!
06/11 13:44, 32F
※ 編輯: kimkao 來自: 61.221.67.235 (06/11 13:46)

06/11 14:50, , 33F
另外!我引述的確實不能完整說明ThreadSafe..可以砍這篇了
06/11 14:50, 33F

06/11 15:07, , 34F
感謝樓主回覆!我跑回去翻書也算是復習忘記的東西!:)
06/11 15:07, 34F
文章代碼(AID): #18JBVjah (Soft_Job)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 10 之 21 篇):
文章代碼(AID): #18JBVjah (Soft_Job)