我正在阅读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++;
}
}
}
如果有人知道,请解释。
答案 0 :(得分:-1)
在多线程应用程序中,如果希望多个线程以同步方式读取和写入对象的状态,则使用synchronized
关键字。
Java用于支持同步的机制是监视器。每个对象都有一个与之关联的监视器。同步块需要一个对象才能使用,这样竞争中的线程就可以竞争,获胜者线程可以获取监视器。
java中的每个非静态方法都有一个隐式this
对象,在该对象上调用特定方法。如果在方法签名中使用synchronized
关键字,则表示您依赖于隐式this
对象进行同步。如果您希望依赖任何其他对象,则可以使用synchronized
块并使用其中的对象引用。
请记住,可能存在各种synchronized
块,但在同一对象上阻塞synchronized
的块只会保证相互正确的同步执行。具有不同对象引用的同步块不会强制线程以同步方式工作。
因此假设有一些threadA修改了objectX的某些状态并使用带有ObjectA的synchronized块。可能在另一个类中可能存在另一段代码,其中一些其他threadB可能正在读取同一对象X的状态。现在,threadB还应该在ObjectA的同步块内进行读取,以便正确读取objectX的状态。