gpt4 book ai didi

java - 是否可以从另一个线程调用锁定对象的方法?

转载 作者:行者123 更新时间:2023-12-02 08:09:55 28 4
gpt4 key购买 nike

当线程1由于以下原因而拥有对象的固有锁时

synchronized(object) {
...
}

可以打电话吗

object.method()

我是否需要从线程 2 分别输入

synchronized(object) {
object.method();
}

在线程 2 中阻止它在线程 1 持有锁时调用该方法?

就我而言,我在迭代 Map 时遇到了 ConcurrentModificationExceptions,并且我尝试通过锁定映射来防止其他线程的修改。我知道 ConcurrentModificationExceptions 的原因通常是迭代期间 map 发生了更改,但我很确定我的情况并非如此,因为迭代中只有“get”语句和一个方法调用,所以不能发生任何修改。

提前致谢。

比纳比克

最佳答案

Java 中的同步是完全协作的 - 如果第二个线程没有选择尝试获取监视器(并且如果方法中没有任何内容尝试这样做),那么它不会自动锁定。

这并不是说对象“被锁定”——而是一个线程拥有与该对象关联的锁。对象本身仍然可以被访问;如果不需要锁,则不会阻塞。

请注意,如果您尝试迭代它并在同一个循环中更改它,即使在单个线程中,您也可能会遇到 ConcurrentModificationException,例如

// Not safe: will throw an exception
for (Map.Entry<String, String> entry : map.entrySet()) {
if (entry.getKey().equals("foo")) {
map.put("bar", "Hello");
}
}

这可能是您的代码中发生的情况,但我们无法判断,因为您没有向我们展示任何代码。如果您可以提供一个简短但完整的程序来演示问题,我们就更有可能弄清楚发生了什么。

关于java - 是否可以从另一个线程调用锁定对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626028/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com