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