附上代码.. 这是什么意思,synchronized(m).. ??为什么我们应该使用.. ?? 同步(此)和&之间有什么区别?同步(M)..?
class Waiter implements Runnable {
Message m;
public Waiter(Message m) {
this.m = m;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
synchronized (m) {
try {
System.out.println("Waiting to get notified at time " +System.currentTimeMillis());
m.wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Waiter thread notified at time "+System.currentTimeMillis());
System.out.println("Message processed ");
}
}
}
答案 0 :(得分:1)
java关键字synchronized
用于通过一个实例同步不同的线程,充当互斥信号量。因此,传递给synchronized
的参数是可以由一个线程专有的实例。由程序员决定,您希望在哪个实例上同步线程。
但是使用资源(在竞争条件下)或该资源的拥有实例是个好主意。稍后启动同步块,越早离开它,应用程序将越好。
答案 1 :(得分:1)
synchronized(this)
和synchronized(m)
之间的区别在于,通过this
同步,您可以在整个实例上进行同步。因此,正如您所期望的那样,当您持有锁时,任何机构都无法在this
上同步。
public synchronized void foo() {
// Handle shared resource
}
类似于
public void foo() {
synchronize(this) {
// Handle shared resource
}
}
通过使用m
之类的对象,您可以对要同步的内容以及何时进行更细粒度的控制。但请记住,如果有人使用foo(),如上所示,它将不会停止访问this
上未同步的方法:
public void anotherLock() {
synchronized(m) {
// Should handle another shared resource
// otherwise you might get unexpected results
}
}
当一个主题使用foo()
时,另一个主题可以访问anotherLock()
。
答案 2 :(得分:0)
synchronized用于线程安全。在您的情况下,它用于实现观察者模式。你想等待Message对象上发生的事情,然后只处理它,这样有人会在你正在等待的消息对象m上通知(m.wait())。
当你在某个对象上等待时,你需要锁定该对象,你总是需要将wait()语句放在wait对象的synchronized块中。这就是你使用synchronized(m)。
的原因你不能用synchronized(this)替换它,因为你在对象m上调用wait(),所以同步应该只在m上。
在你的应用程序的某个地方,你必须调用m.notify()或m.notifyAll(),它将在m上恢复你的wait()。