当前位置: 首页 > 面试题库 >

同步(此)阻止整个对象?

楚举
2023-03-14
问题内容

从已接受的答案回答这个问题:在Java关键部分中,应该同步什么? 我了解到

public synchronized void foo() {
    // do something thread-safe
}

和:

public void foo() {
    synchronized (this) {
        // do something thread-safe
    }
}

做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作?


问题答案:

您似乎在混合事物。

首先

public synchronized void method() {
}

从同步角度看,它等效于:

public void method() {
    synchronized (this) {
    }
}

优点/缺点已被提及,各种重复项提供了更多信息。

其次,

synchronized(someObject) {
    //some instructions
}

意味着同步块中的指令不能由2个线程同时执行,因为它们需要先获取监视器someObject。(假设someObject是不变的最终引用)。

就您而言,someObject恰好是this

对象中任何未同步的代码仍可以并发执行,即使监视器处于this运行状态,因为该线程正在运行同步块,即使该监视器处于打开状态。换句话说,synchronized(this)不“锁定整个对象”。它仅防止2个线程同时执行同步块。

最后,如果您有两个synchronized方法(都this用作锁),如果一个线程(T1)获得this执行这两个方法之一的锁,则不允许其他线程执行这两个方法中的
任何 一个,因为它们需要获取thisT1已经持有的锁。

这种情况可能会在关键部分中引起争用,在这种情况下,必须使用更细粒度的锁定策略(例如,使用多个锁定)。



 类似资料:
  • 如果我们有一个synchronized方法,在使用同一个对象时需要进行同步,那该怎么做呢? 例如,我们有一个 同步函数,如果所有参数在不同的调用中都不同,则可以并行执行,但如果调用 1 中的参数与调用 2 中的参数相同,则不能并行执行: 如果和同时调用函数,我们将如何停止这里的死锁? 我认为和是易失性的,或者基于和的哈希值进行同步,或者通过包含和的新对象进行同步。

  • 问题内容: 这个问题是面向jQuery的,但不一定是排他的。 简短的问题: 同步ajax调用会阻止正常按钮被单击吗? 我的测试表明这没有发生,但也许其他浏览器出了问题。 长的问题: 在我询问的另一个问题中,如何阻止ajax调用(我希望它阻止),这些家伙说浏览器在某些情况下会阻止。 实际上,甚至jQuery 的文档都说: 我正在尝试: 1.了解发生这种情况的方式/原因。 2.评估发生这种情况的可能性

  • 问题内容: 我刚刚遇到了Java中的同步块,并编写了一个小程序来测试它的工作方式。 我创建10个线程,并让每个线程将一个Integer对象增加1000次。 因此,在使用同步的情况下,所有线程完成工作后,我将假定结果为10000,而在没有同步的情况下,结果将小于10000。 但是,同步并没有如我所料。 我猜想这与对象的不变性有关。 我的程序: 有人可以澄清吗? 问题答案: 每次您对 进行同步时,sy

  • 当我解析本地HTML文件时,jsoup将锚元素中的引号改为 假设我想将下面HTML部分中的值“一”改为“二”: 我得到的是: 锚点元素内的引号是必需的。我的代码现在看起来像这样: 我试过了 没有成功。 我可以用jsoup实现这一点吗?我必须使用不同的解析器吗?那看起来会是什么样子。 提前非常感谢你。

  • (注意:如果我在这里使用关系数据库术语,很抱歉。) 假设我有十个客户端连接到一个数据库。该数据库的持续吞吐量约为每秒1k次更新。显然,对于最终用户来说,每秒向web浏览器发送1k个更新(比如每秒1MB的数据更改)并不是一个好的体验。Firebase是否可以控制客户端在开始限制数据之前可以“接受”的数据量?我理解它可能会批量请求,但我的观点是,谷歌接受数据/更新的速度比浏览器更快(可能是通过弱互联网

  • 问题内容: 有没有一种方法可以执行不冻结浏览器的同步AJAX查询?在我看来,在大多数情况下,同步请求要容易得多,但是它们阻止了代码其他部分的执行,这是一个真正的杀手。有没有办法获得同步AJAX而没有负面影响?(是的,我意识到术语“同步AJAX”是矛盾的。) 问题答案: 在即将到来的ECMAScript 2016(ES7)标准中,提供了一组新的语言关键字,这些关键字旨在执行与您似乎正在寻找的目标非常