为什么我们需要在java中的同步语句中传递参数?

时间:2017-05-01 14:13:53

标签: java synchronize

我正在阅读java中的同步概念,并遇到了同步语句。

我想知道,为什么我们将参数传递给它,虽然它看起来像静态块(它只是一个例子),并且传递的参数没有指定任何数据类型。

示例:

public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }

    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}

如果有人知道,请解释。

1 个答案:

答案 0 :(得分:-1)

在多线程应用程序中,如果希望多个线程以同步方式读取和写入对象的状态,则使用synchronized关键字。

Java用于支持同步的机制是监视器。每个对象都有一个与之关联的监视器。同步块需要一个对象才能使用,这样竞争中的线程就可以竞争,获胜者线程可以获取监视器。

java中的每个非静态方法都有一个隐式this对象,在该对象上调用特定方法。如果在方法签名中使用synchronized关键字,则表示您依赖于隐式this对象进行同步。如果您希望依赖任何其他对象,则可以使用synchronized块并使用其中的对象引用。

请记住,可能存在各种synchronized块,但在同一对象上阻塞synchronized的块只会保证相互正确的同步执行。具有不同对象引用的同步块不会强制线程以同步方式工作。

因此假设有一些threadA修改了objectX的某些状态并使用带有ObjectA的synchronized块。可能在另一个类中可能存在另一段代码,其中一些其他threadB可能正在读取同一对象X的状态。现在,threadB还应该在ObjectA的同步块内进行读取,以便正确读取objectX的状态。