作者kimkao (魂縈夢牽)
看板Soft_Job
標題Re: [討論]國外軟體工程師與台灣的差別
時間Mon Jun 9 12:56:10 2008
※ 引述《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
1F:推 Harifucks:那原程式要怎麼修改才能變成Thread-Safe? 06/09 23:38
2F:推 laxw:Google "how to kill singleton" 06/10 00:15
3F:推 opman:這種專教 thread 的章節,應該都會提, 06/10 09:37
4F:→ opman:不同語言會有不同語法,但大約都是那幾種 06/10 09:38
5F:→ opman:基本上不是 singleton 有問題, 06/10 09:39
6F:→ opman:而是寫 thread 的人,對 thread 不熟,才會誤用都不知道. 06/10 09:39
7F:→ opman:這年頭,懶得買書來看的,好像越來越多. 06/10 09:41
8F:→ opman:應該是說懶得看書啦. 圖書館有免費的,經典書籍通常會有. 06/10 09:41
9F:→ opman:有的連 網路搜尋都很少在用. 06/10 09:43
10F:推 tangblack:我沒記錯的話! Thread 不是要用 start() 來開始? 06/10 12:44
11F:→ kimkao:看一下這個api說明吧 06/11 09:26
12F:→ kimkao: Causes this thread to begin execution; 06/11 09:26
13F:→ kimkao:the Java Virtual Machine calls the run method of 06/11 09:26
14F:→ kimkao:this thread. 06/11 09:27
15F:推 tangblack:我想表達的是 06/11 13:12
16F:→ tangblack:若直到呼叫run(),就變成單純呼叫物件上的方法. 06/11 13:13
17F:→ tangblack:而不是多線程(Thread)的並行行為. 06/11 13:14
18F:→ tangblack:而是樓主本來就只想要建立兩個物件然後輪流呼叫 06/11 13:15
19F:→ tangblack:它們的run(). 06/11 13:15
20F:→ tangblack:所以上述main的程式碼我看到的次序 06/11 13:16
21F:→ tangblack:應該永遠是 t1.run()->t2.run()->t1.run() 06/11 13:17
22F:→ tangblack:依序執行 而非 多線程的執行方式. 06/11 13:18
23F:推 tangblack:關於樓主回覆API中說明文字: 06/11 13:27
24F:→ tangblack:我認為應該是指 多線程要透過 start()呼叫run()來啟動! 06/11 13:28
25F:→ tangblack:而start()也只能被呼叫一次! 否則會發生執行期錯誤! 06/11 13:29
26F:→ tangblack:不知這樣解釋是否有讓樓主知道我在問什麼? 06/11 13:30
27F:→ tangblack:我想知道樓主直接呼叫run()的理由! 06/11 13:31
28F:→ tangblack:是誤用? 06/11 13:32
29F:→ tangblack:還是要解釋ThreadSafe行為?(若是此情況我就看不懂code) 06/11 13:32
30F:→ kimkao:多謝tangblack說明,其實我上述的api說明原本只是要說 06/11 13:42
31F:→ kimkao:start()會呼叫run()而已,但確實是真的應該要用start()才能 06/11 13:43
32F:→ kimkao:真正達成多線程處理..感謝指正! 06/11 13:44
※ 編輯: kimkao 來自: 61.221.67.235 (06/11 13:46)
33F:→ kimkao:另外!我引述的確實不能完整說明ThreadSafe..可以砍這篇了 06/11 14:50
34F:推 tangblack:感謝樓主回覆!我跑回去翻書也算是復習忘記的東西!:) 06/11 15:07