问题标签 [synchronized-block]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
134 浏览

java - 同步方法和块的行为不同

我观察到使用同步方法或同步块产生不同结果的场景。从下面的代码:

当我在 Caller::run 方法中使用同步块时,输出同步如下:

但是当我对 Callme::call 方法使用同步方法时,而不是同步块,输出不同步:

我的期望是两种情况下的输出都不应该同步,因为我在调用“Callme::call”方法时使用了不同的对象

这让我质疑我对同步块概念的理解?

0 投票
1 回答
41 浏览

java - 同步(Test2.class)发生了一些奇怪的事情

以上是我尝试过的代码。当我在一个同步的类(Test2.class)中编写所有代码时,我发现发生了一些奇怪的事情。调用 foo() 方法后,我无法立即调用 bar() 方法。我认为它锁定了同一个对象。如何解释这个奇怪的事情。

0 投票
3 回答
752 浏览

java - 如果我们正在同步读取,我们是否需要同步写入?

我对同步块毫无疑问。在我提出问题之前,我想分享另一篇相关帖子的答案链接以回答相关问题。我从同一个答案中引用彼得劳里的话。

  1. 同步可确保您拥有一致的数据视图。这意味着您将读取最新值,而其他缓存将获得最新值。缓存足够聪明,可以通过特殊的总线相互通信(JLS 不需要,但允许)这种总线意味着它不必接触主内存即可获得一致的视图。

  2. 如果只使用同步,则不需要 volatile。如果您有一个非常简单的操作,而同步操作会过大,那么 Volatile 很有用。

参考上面我有以下三个问题:

Q1。假设在多线程应用程序中有一个对象或原始实例字段仅在同步块中读取(写入可能发生在其他一些没有同步的方法中)。同步块也定义在其他一些对象上。将其声明为 volatile(即使仅在 Synchronized 块中读取)是否有意义

Q2。我了解已完成同步的对象状态的值是一致的。我不确定在 Synchronized 块中读取的其他对象和原始字段的状态。假设在没有获得锁的情况下进行了更改,但是通过获得锁来完成读取。同步块内所有对象的状态和所有原始字段的值是否始终具有一致的视图。?

Q3。[更新]无论我们锁定什么,在同步块中读取的所有字段都将从主内存中读取吗?[CKing回答]

我为上述问题准备了参考代码。

0 投票
2 回答
1566 浏览

java - Java `synchronized` 是否会阻塞对象引用或值的锁定?

给定如下所示的输出:

给定以下两个线程,两个线程是否有可能同时在临界区运行?

0 投票
2 回答
720 浏览

java - Java多线程 - 同步块中的读取器和写入器线程

这是一个求职面试的问题:

如何识别同步块中的读线程和写线程?

0 投票
1 回答
59 浏览

java - 具有相同对象引用的不同线程的两个同步块仍然同时执行

如果我理解正确,那么在第 7 行同步块引用对象t1,在第 15 行同步块也引用同一个对象,因此一次只有一个线程可以获取该对象的锁,其他线程必须等待。

那他们为什么要争执呢?输出混合像

0 投票
1 回答
905 浏览

java - java中的挂起、恢复和停止线程

我正在学习java中的线程。

以下示例显示了如何挂起、恢复和停止线程:

但是这个块:

为什么这个块必须指定同步?

我知道“同步”用于控制线程对共享资源的访问以及如何使用这个关键字,但在示例中,只有 2 个线程:主线程和 ob1 线程。并且主线程不会进入该同步块或 MyThread 类中的任何同步方法。我就是想不通原因。

我试图删除块之前的“同步”关键字。程序在线程“我的线程”中返回了一个错误,而主线程仍然完成了它的执行。

0 投票
1 回答
295 浏览

java - 以线程安全的方式在Hashmap中增加值以保持高性能而不同步?

我有一个具有不同变量的模型。

}

现在,当我启动服务器时,创建的模型是一个单例 bean。当有人调用端点时,我希望能够修改模型的哈希图

/增量

synchronized目前,当我添加关键字时,此 incrementPageRequest 不是线程安全的,该方法变为线程安全的,但我听说同步的成本非常高,我正在寻找高吞吐量和性能。

在不同步和保持高性能的情况下如何实现相同的目标?

更新

尝试使用 Concurrent HashMap 仍然失败我正在使用 Jmeter 测试对 api 的并发调用

我如何更改此逻辑以使其在并发哈希图中起作用

0 投票
1 回答
90 浏览

java - 我们可以在同步方法中定义同步块吗?

在java中,我们可以在同步方法中定义同步块吗?如果是这样,请举例说明

0 投票
1 回答
172 浏览

java - Java等待方法的工作

我有以下代码:

在 ThreadDemo 的 main 方法中,我正在创建一个线程对象 ThreadImpl 并启动它。接下来,主线程休眠 1000ms。线程的 run 方法将在一个单独的线程中执行。作为其中的一部分,它循环 100000 次并休眠 2000ms。然后它退出该方法。主线程唤醒并获取“thr”的锁,然后进入等待状态。由于另一个线程已经完成了它的执行,这个等待应该是永远的。但是,我看到以下结果:

METHOD 1729414014 METHOD Get
the lock
METHOD Going for sleep
METHOD Woke up
METHOD Done leave the thread
MAIN 1729414014
Main --> 得到锁
Main --> 完成等待

在没有人通知的情况下,main 方法如何继续执行?