私は、元々 (私が信じている) IBM developerworks サイトからのスレッド化チュートリアルを読んでいました。その中で、彼らは synchronized キーワードと、コードのブロック自体ではなく、実際のオブジェクトによって同期されたコードのブロックがどのようにロックされるかについて話しました。
たとえば、以下のコードでは、作成者は、静的クラス '<code>Thingie のsetLastAccess
メソッドが同期化されているとリストされていても、その下で定義されている 2 つのスレッドはsetLastAccess
、thingie に異なる値を使用しているため、それぞれ同時に呼び出すことができると述べています。しかし、thingie が静的である場合、それは同じ値を使用していることを意味しませんか?
同じオブジェクトを参照している場合でも、変数名が異なるだけでよい場合はありますか?
public class SyncExample {
public static class Thingie {
private Date lastAccess;
public synchronized void setLastAccess(Date date) {
this.lastAccess = date;
}
}
public static class MyThread extends Thread {
private Thingie thingie;
public MyThread(Thingie thingie) {
this.thingie = thingie;
}
public void run() {
thingie.setLastAccess(new Date());
}
}
public static void main() {
Thingie thingie1 = new Thingie(),
thingie2 = new Thingie();
new MyThread(thingie1).start();
new MyThread(thingie2).start();
}
}