【问题标题】:Why do we need to pass arguments in Synchronized Statements in java? [duplicate]为什么我们需要在 java 中的同步语句中传递参数? [复制]
【发布时间】:2017-05-01 14:13:53
【问题描述】:

我在阅读 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++;
        }
    }
}

如果有人知道,请解释一下。

【问题讨论】:

  • 因为你需要说出你要锁定什么对象。
  • 你是说lock1lock2被通过了吗?这些是正在同步的对象。
  • @SidhantBansal 查找任何解释 synchronized 的教程。它应该深入地覆盖锁。
  • 从技术上讲,这是正确的。 JLS 并未将其称为论据。 (而synchronized(lock1) 不是方法调用……就像while(true) 是方法调用一样。)

标签: java synchronize


【解决方案1】:

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

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

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

请记住,可能有各种synchronized 块,但同一对象上带有synchronized 块的块只能保证彼此之间正确同步执行。具有不同对象引用的同步块不会强制线程以同步方式工作。

因此假设当有一些 threadA 修改了 objectX 的某些状态并与 ObjectA 的同步块一起工作。可能有另一段代码可能在某个其他类中,其中某个其他线程B 可能正在读取同一个对象X 的状态。现在 threadB 也应该在与 ObjectA 的同步块中进行读取,以便正确读取 objectX 的状态。

【讨论】:

  • 投反对票的原因,我很乐意纠正自己。
  • 不是我……但你的回答并没有真正回答这个问题。 OP 没有要求在synchronized 上提供教程。真正的答案很简单:1)lock1lock2 是您要锁定的互斥体,2)它们不是参数,因为这不是方法调用。
  • @nits.kk 不是我,但有人将我的问题标记为重复。可能是他对你的答案投了反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多