lar*_*ryq 1 java multithreading synchronize
我正在阅读最初来自(我相信)IBM developerworks站点的线程教程.在其中,他们讨论了synchronized关键字以及同步代码块如何被实际对象锁定,而不是代码块本身.
例如,在下面的代码中,作者声明即使静态类Thingie的setLastAccess方法被列为同步,下面定义的两个线程也可以setLastAccess同时调用,因为它们使用的是不同的值.但是,如果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();
}
}
Run Code Online (Sandbox Code Playgroud)
您将静态方法与静态类混淆.如果setLastAccess是一个静态方法,那么如果它被标记为synchronized,它将锁定Class实例ClassLoader- 每个加载器只有一个.如果该方法是静态的并且是同步的,则线程将锁定在同一对象上.
但是,在您的示例中,Thingie 类被标记为静态,而不是方法.在关键字static 类是指Thingie不依赖于外部SyncExample类-它不意味着只有一个的情况下Thingie,它不会影响同步.所以在你的例子中,当setLastAccess标记时synchronized,它会锁定class Thingie(this)的实例.由于有两个实例(thingie1和thingie2),因此锁定在不同的对象上.显然,如果两个线程都被传入,thingie1那么它们都将锁定在同一个对象上.
这里有一些阅读:
| 归档时间: |
|
| 查看次数: |
6180 次 |
| 最近记录: |