问题标签 [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 投票
3 回答
545 浏览

java - 在同步块中声明的不可访问变量 - Java

这段代码不会编译:

然而我不知道为什么.. 我的理解是同步块总是最终被执行,所以我希望同步块之后的代码能够知道任何新声明的变量。我哪里错了?

0 投票
3 回答
982 浏览

java - Java 线程:同步块

我需要一些帮助来确保我理解同步块。假设以下示例:

我的问题是,为了安全起见,是否足以同步 ThreadA 中的整个队列对象以将对象提交给队列类?我在 ThreadB 中做了同样的事情来从队列中删除一个对象。或者我是否也必须同步 Queue 类中的 submitObject() 和 deleteObject() 方法?

据我了解,如果我将整个 Queue 类锁定在线程中,如上所示,我应该是安全的 - 对吧?

GreetZ 并提前致谢。

0 投票
1 回答
155 浏览

java-me - 为什么在 Java 中调用 cancelInquiry 取消,在某些诺基亚手机上进行蓝牙查询时,代码会挂起?

我在配备 S40 的诺基亚设备上遇到问题(但在 S60 上没有)。问题是这样的:当您从同步块中调用discoveryAgent 的cancelInquiry 方法时,它会挂起。它实际上应该回调inquiryCompleted。代码只是冻结-永远不会进入inquiryCompleted方法。如果完成了相同的事情,但不是在同步块内完成 - 一切正常。问题是我需要同步块,以便其中的所有内容在多线程应用程序中原子执行。

这就是我的 DiscoveryListener 的样子:

当您在 s40 和 s60 上运行上述代码时,注释掉同步语句,并调用 cancel() 方法,inquiryCompleted 方法会立即被调用并且您会听到哔声。但是,如果您取消注释同步语句,您会听到 S60 上的哔哔声,但在 S40(至少在第 5 版 fp1 上),从不调用 queryCompleted!(当我在调用discoveryAgent的cancelInquiry之前放置哔哔声时,它发出哔哔声。当我在那个调用之后放置它时,它没有到达那里。那是因为调用不会返回,直到它调用inquiryCompleted并且该调用不会发生)

问题是什么?如果这是 S40 的 cancelInquiry 的 impl'n 中的错误,我该如何解决?我必须同步,因为事情是并行完成的(例如,我的代码可能会开始查询,然后可能会取消它。在它被取消时,startInquiry 可能正在运行,deviceDiscovered 可能正在运行,inquiryCompleted 可能正在运行,并且当然,与其中任何一个并行,传入的 cancelInquiry 可能正在运行。

我试图将inquiryCompleted 分离到另一个侦听器实例中,换句话说,我没有调用discoveryAgent.cancelInquiry(this),而是调用了discoveryAgent.cancelInquiry(anotherInstance),希望调用“anotherInstance”中的inquiryCompleted,但不,它挂起方式也是如此。

有什么建议么?提前致谢

0 投票
3 回答
424 浏览

java - 如果在同步块之外声明/返回返回值,方法是否是线程安全的?

由于foo在同步块之外声明,是否存在返回坏数据的可能性?

0 投票
4 回答
1674 浏览

java - Why are WebMethods blocked when threads are synchronized?

Please see my code example of a JAX-WS Webservice:

}

If the WebMethod is called twice, the second call is waiting for thread X to complete - why?

0 投票
1 回答
683 浏览

java - 同步块:其他变量“内部”的变量是否已更新

很抱歉这个非技术性的标题,但我认为它很好地总结了我的问题。如果我正确解释了我读过的内容,同步块(除了其他后果)将使所有变量更新到主内存/从主内存更新(即使是那些在同步块内没有显式访问的变量,只有它们的“父”?) . 例如引用这个stackoverflow问题的答案(我把它断章取意,我稍后会回到它):

内存屏障适用于所有内存引用,甚至是不相关的内存引用。

我需要确认我是否正确解释了这一点。我有 2 个线程(线程 A、线程 B)。考虑以下代码:

getterB()ThreadB调用,从initA()ThreadA调用。(请注意,甚至在创建ThreadB之前调用它,因此只有和是并发的。)还要注意,我有充分的理由不返回数组的副本(不,threadB不想更改其元素;原因是我的软件的外部要求,现在不相关)。operationA()initA()getterB()operationA()getterB()

线程B这样做:

如您所见,在内存屏障中getterB()anArray访问引用,而不是数组值本身。我的问题:

  1. threadB 会看到最新的数组元素值吗?(即元素本身是否也从主内存更新getterB()?)

  2. 引用的声明提到不相关的缓存副本也从主内存更新。我不是 100% 如何解释这个不相关的(与用于锁定的变量无关?或与整个同步块无关?)。我知道我把引用断章取义了,因为这是一个不同的 stackoverflow 问题,所以我在那里添加了评论。所以我很感激我的这个问题是否在那里(或这里——我不在乎)得到了回答。

  3. anArray如果是对象数组(而不是原始类型),答案有什么不同吗?更进一步,如果它不是一个数组,而是一个包含对其他类的引用的类怎么办?(即引用其他对象的对象,通过返回的对象访问包含的对象getterB())。threadB 会使用 这些包含引用的最新副本,还是使用它自己的本地缓存副本(因为getterB()只更新了它们的容器对象,而不是包含的引用本身)?

0 投票
3 回答
625 浏览

java - 此代码可能引发 IllegalMonitorStateException

此方法引发 IllegalMonitorStateException。有人可以解释为什么会这样。

提前致谢

0 投票
3 回答
114 浏览

java - 同步访问的方法应该同步吗?

我想从一个synchronized块中访问一个方法。这是一个例子:

doSequentialStuff为了编写干净的代码,我想知道明确地创建方法是否好synchronized。恕我直言,这在语义上没有任何区别,因为在这两种情况下都有锁,this并且保证只能从synchronized块中访问该方法。我希望增加可读性。

有什么建议吗?

编辑: 我修改了示例以合并评论。

0 投票
2 回答
845 浏览

java - 并发异常

我在 run() 方法中收到 ConccurentModificationException。我尝试了以下,但没有奏效:

0 投票
3 回答
224 浏览

java - Java 同步和集合

如果同步的代码块包含未同步的集合。集合是否被认为是线程安全的?如果没有,您能否提供两个线程可能不安全地访问同步代码中的集合的任何实际场景?

谢谢。