Я читал учебник по потокам, который изначально был (как мне кажется) с сайта IBM DeveloperWorks.В нем они говорили о ключевом слове synchronized и о том, как синхронизированный блок кода блокируется самим объектом, а не самим блоком кода.
Например, в приведенном ниже коде авторы утверждают, что, хотя метод Thingie
статического класса 'setLastAccess
указан в списке как синхронизированный, каждый из двух потоков, определенных ниже, может вызывать setLastAccess
одновременнопотому что они используют разные значения для штуковин.Но если штука статична, не означает ли это, что они используют одно и то же значение?
Это тот случай, когда имена переменных должны различаться, даже если они ссылаются на один и тот же объект?
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();
}
}