我正在阅读(我相信)来自 IBM developerworks 网站的线程教程。在其中,他们谈到了 synchronized 关键字以及同步代码块如何被实际对象锁定,而不是代码块本身。
例如,在下面的代码中,作者声明即使静态类 'Thingie
的 setLastAccess
方法被列为同步的,它下面定义的两个线程每个人都可以同时调用 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();
}
}
最佳答案
您将静态方法 与静态类 混淆了。如果 setLastAccess
是静态方法,那么如果它被标记为 synchronized
,它将锁定在 Class
实例上ClassLoader
——每个加载器只有一个。如果该方法是静态的和同步的,那么线程将锁定在同一个对象上。
但是,在您的示例中,Thingie
类 被标记为静态,而不是方法。 class 上的 static 关键字意味着 Thingie
不绑定(bind)到外部 SyncExample
类——它不意味着只有一个 Thingie
实例并且它不影响同步。所以在你的例子中,当 setLastAccess
被标记为 synchronized
时,它锁定在 Thingie
类的实例上(this
).由于有两个实例(thingie1
和 thingie2
),因此锁定在不同的对象上。显然,如果两个线程都在 thingie1
中传递,那么它们将锁定同一个对象。
这里有一些阅读:
关于java - java中的同步关键字和静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811701/