作者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