问题标签 [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 回答
213 浏览

java - Java中的并发使用同步块没有给出预期的结果

下面是一个简单的java程序。它有一个名为“cnt”的计数器,该计数器递增,然后添加到名为“monitor”的列表中。“cnt”由多个线程递增,值由多个线程添加到“monitor”。

在方法“go()”的末尾,cnt 和 monitor.size() 应该具有相同的值,但它们没有。monitor.size() 确实具有正确的值。

如果您通过取消注释其中一个已注释的同步块并注释掉当前未注释的块来更改代码,则代码会产生预期的结果。此外,如果将线程计数 (THREAD_COUNT) 设置为 1,则代码会产生预期的结果。

这只能在具有多个真实内核的机器上重现。

0 投票
1 回答
241 浏览

java - 在线程之间创建延迟

所有,我有一个由许多线程调用的 api 调用。唯一的问题是延迟赌注。线程应至少为 1 秒。我意识到 - 没有同步块 - 如果一个线程在时间 t1 调用 api,那么所有其他线程等待 1 秒,然后所有其他线程在 t1 + 1 秒调用 api。这不是我想要的,所以我将整个等待块放在同步块中,只要一个线程正在等待所有其他线程块。

这行得通;但是,我认为这不是最有效的方法。

非常感谢任何建议。

0 投票
2 回答
2183 浏览

java - Java以不同的方法在同一对象上同步块

我试图理解java中同步块的概念。根据我阅读的文档,我了解到如果我们获取锁(使用实例变量的同步块),那么我们无法在该类中的同一对象上获取同步锁。但是当我实际尝试使用以下代码段时,我发现我的理解出错了。

即我能够同时在两种不同的方法中获取锁(同一实例变量上的同步块)。当线程启动时,它将进入 run 方法并无限期地等待,并且不会退出同步块。同时,如果我使用同一个线程调用 stop 方法,它会进入同步块并执行通知语句。我在 Java 文档中进行了搜索,但找不到任何内容。

这是代码片段:

这是我如何管理 MyClass 线程的代码片段:

根据我的理解,当线程启动时,它将获取“锁定”对象的锁定(MyClass 的运行方法中的同步块)。当我调用 stop 方法时,它应该无限期地等待,直到 run 方法从同步块中出来(在这种情况下永远不会发生)。但是当我执行时,调用停止方法获取了“锁”对象上的锁并通知了导致线程关闭的对象。

0 投票
1 回答
200 浏览

java - java同步块-锁定整个方法

我不太确定如何正确使用同步块。我知道使用 synchronized 关键字会锁定整个班级。所以那不是我想要的。我想锁定类中的单个方法。这是我班上的一个例子。

如何正确使用同步块来锁定整个方法?我可以选择任何参数(或名称或密码)吗?有什么区别:

和:

和:

createPayload 没有访问任何共享的内容。看起来像:

我认为我必须同步方法,因为有多个实例同时访问 MessageFactory 中的方法。如果我错了,请告诉我。

0 投票
1 回答
59 浏览

java - 同步方法中的 synchronized(this) 块

以下是Java并发实践书中讨论开放调用时的代码片段。我没有得到的一点是声明 setLocation 方法的方式,它已经同步并再次在同一方法中调用 synchronized(this) 块,为什么这样?是类型错误吗?同步方法已经持有该方法的锁,那么为什么还要为同一个对象呢?

0 投票
2 回答
644 浏览

java - Java中的对象锁

我试图理解 Java 中的“同步块”。我已经编写了非常基本的代码来查看如果我锁定和更改 thread_1 中的对象并通过另一种方法从另一个 thread_2(竞争条件)访问它会发生什么。但是我很难理解这种行为,因为我期望 Thread_1 会首先更改值,然后 Thread_2 会访问新值,但结果与我预期的不同。

输出是:

Thread_1 锁定“A”字符串对象并对其进行更改,但 Thread_2 可以在其更改之前读取该值。当“A”被锁定时,thread_2如何访问“A”对象?

0 投票
1 回答
214 浏览

java - 设计模式:如何在 Java 中的单例模式中创建同步方法或块?

我正在使用 Java 实现后端服务。我选择应用该Singleton模式是因为应该只运行一项服务。但是,该服务也是一个 Socket.IO 客户端,因此在服务器推送时必须触发某种事件。但是该事件应该synchronized在队列中。

我认为我的实现不正确。Tt 似乎该 synchronized(this)块不是保护Backend对象而是保护Emitter.Listener对象。

0 投票
2 回答
324 浏览

java - Java中同步块的简化

我在理解 Java 中同步块的概念时遇到了一些麻烦。我觉得我已经很好地理解了同步方法。所以我想到了一个类比来帮助我从同步方法的角度来理解同步块。请让我知道我提出的这种等效方法是否正确。另外,我现在只针对非静态同步块提到了这一点。然而,静态同步块上的点也是受欢迎的。

相当于

在 objRef 类中:

这个类比是基于同步块的行为与同步方法一样的逻辑。这意味着一旦一个线程获得了监视器上的锁,它就不允许其他线程干扰它的执行。线程仅在执行完整个同步方法后才放弃控制。

0 投票
4 回答
2759 浏览

java - 在对象上同步并更改引用

假设我有一个对象如下:

然后我按如下方式在这个对象上同步并更改它的引用:

使用此代码,m 上的锁会发生什么?更新 m 表示的新对象是否仍然安全?还是锁定本质上是在旧对象上?

0 投票
1 回答
498 浏览

java - 如何使用 notify/wait() 唤醒/暂停特定(组)线程?

我想知道例如 r.wait() 是否有效?使用此代码:

r.wait()、w.wait()、r.notify()、w.notify() 是如何工作的?它们如何与同步(r)/同步(w)一起工作?