プロが教えるわが家の防犯対策術!

javaの同期について


package rwlock;
public class App1 extends Thread {
static private final int REFER = 0;
static private final int UPDATE = 1;

static private final int[] conf1 = { REFER, REFER, REFER, UPDATE };
static private final int[] conf2 = { REFER, UPDATE, REFER, REFER };

static private MyObj0 mo = new MyObj0(); // App1 + MyObj0

int id;
private int[] conf;

public App1(int id, int[] conf) { this.id = id; this.conf = conf; }

public void run() {
long tStart = Time.current();
for (int i = 0; i < conf.length; i++) {
switch(conf[i]) {
case REFER:
mo.refer();
break;
case UPDATE:
mo.update();
break;
default:
assert false : "internal error";
}
}
if (id == 1) { Time.printElapsed(tStart); }
}

public static void main(String[] args) {
App1 th1 = new App1(1, conf1);
App1 th2 = new App1(2, conf2);
th1.start();
th2.start();
}

}

public class MyObj0 {

private Object countLock = new Object();
private int count;

private void enter() { synchronized(countLock) { count++; } }
private void leave() { synchronized(countLock) { count--; } }

public MyObj0() { count = 0; }

public void refer() {
enter();
Time.sleep(300);
leave();
}

public void update() {
enter();
synchronized(countLock) {
assert count == 1;
}
Time.sleep(500);
leave();
}



において、updateの実行中は、他のスレッドでもupdateもreferも実行されないが、二つのスレッドで同時にreferは実行されうるという条件を満たすにはどうしたらよいでしょうか?updateにsynchronizedをつけてみましたが、referが同時に実行されてしまいました

A 回答 (1件)

    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございます。

お礼日時:2010/07/31 15:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!