作者oak01 (oak)
看板java
标题[问题] concurrent program
时间Mon Jun 13 13:36:32 2011
question: 使用java 完成semaphore 实作
ans:
public class ExamPractice extends Thread {
public static Object lock = new Object();
public static int A = 1000;
public static int B = 0;
private int amount;
public ExamPractice (int x) {
amount = x;
}
public void run() {
synchronized(lock) {
if (A>=amount) {
A= A-amount;
B= B+amount;
}
}
}
public static void main(String[] args) {
Thread t1= new ExamPractice(100);
Thread t2= new ExamPractice(200);
t1.start();
t2.start();
System.out.println("A= "+A);
System.out.println("B= "+B);
}
}
question:
想要从帐号A转帐X元到帐号B去, X转帐100元,X转帐200元,竞争同步
但是出来的答案A有时候是900,800,700
根本就不正确阿!
请问这样的critical region哪里有问题呢?
那个synchronized(lock)根本有加跟没加一样说=.=
--
2F:→ tkcn:印出来时, t1, t2 不一定开始执行了 06/13 13:58
3F:→ uziel:提示:Thread 的 join() 方法 06/13 14:37
本来有用
try{
t1.join();
t2.join();
} catch () {}
System.out.println("A= "+A);
synchronized(lock) 是不是没加也一样呢
这样还可以算是semaphore的实作吗?
question: 若限定用c++,java,ada实作semaphore,monitor,message passing
请问各位觉得考试的时候用哪个语言举例子比较好?
--
爬网路上面的是c++的例子
教科书上写的是ada的例子
※ 编辑: oak01 来自: 124.218.3.118 (06/13 22:26)
4F:推 syamp:你又没用到lock这个object, synchronize完全没意义 06/13 23:16
5F:推 syamp:要嘛就synchronized(this), 要嘛就public synchronized void 06/13 23:19
6F:推 syamp:run() 06/13 23:21
※ 编辑: oak01 来自: 124.218.3.118 (06/14 06:50)
7F:→ adrianshum:建议原 po 搞清楚自已在做什麽才说 "是不是没加也一样" 06/14 09:18
8F:推 AI3767:可以试试Thread的getState() 06/14 11:26