当前位置: 首页 > 知识库问答 >
问题:

为什么我们需要在java的SynchronizedStatements中传递参数?[副本]

徐德海
2023-03-14

我正在阅读有关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个答案

罗翔
2023-03-14

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

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

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

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

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

 类似资料:
  • 我看了一下Java8与7相比的新闻,除了lambdas或新的时间框架等非常有趣的东西之外,我发现一个新特性(?)介绍了:默认方法。 我在这篇文章中发现了以下示例: 在我看来很奇怪。上面的代码看起来像一个具有已实现方法的类。那么,为什么要在一个接口中引入默认方法呢?这种做法的实际好处是什么? 在同一篇文章中,我读到了这样的解释: 为什么要在接口中添加方法?这是因为接口与它们的实现类耦合得太紧了。即在

  • 问题内容: 我将稍微解释一下我的脚本,以便您可以理解我的问题。 基本上我做了一个脚本来检查SOCKS5是还是。 当我在上面测试我的脚本时,它运行良好,但是当我在Windows上对其进行测试时,直到我将以下行添加到: 谁能向我解释为什么我在Windows中需要此行,而在Linux服务器上却不需要? 问题答案: SSL证书上的此cURL手册页介绍了连接到SSL / TLS受保护主机时 证书验证 的过程

  • 问题内容: 我知道弱引用是垃圾收集器的摆布,我们不能保证弱引用会存在。我认为没有必要提供较弱的参考,但可以确定应该有一个理由。 为什么我们需要Java中的弱引用? Java中弱引用的实际(某些)用法是什么?如果您可以分享您在项目中的使用方式,那就太好了! 问题答案: 使用弱哈希图实际上通常是一个坏主意。首先,很容易出错,但更糟糕的是,它通常用于实现某种缓存。 这意味着以下内容:您的程序在一段时间内

  • 在java中,我们有一些方法来实现一些逻辑。那么匿名函数有什么用呢?当我们真的需要匿名函数时。

  • 问题内容: 基数实际上是什么意思?我们为什么需要它? 问题答案: 您可能并不总是希望将整数解析为以10为底的数字,因此提供基数可以指定其他数字系统。 基数是一位数字的值数。十六进制为16。八进制为8,二进制为2,依此类推… 在该函数中,您可以执行一些操作来提示基数而不提供基数。如果用户输入的字符串与其中一个规则匹配,但没有明确规定,则这些方法也可能对您不利。例如: