当我们说同步(实例字段)时,它意味着什么?

时间:2014-04-01 11:16:11

标签: java multithreading object locking synchronized

附上代码.. 这是什么意思,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 ");
        }
    }
}

3 个答案:

答案 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()。