gpt4 book ai didi

java - 从同步块(synchronized block)调用这个同步方法可以吗?

转载 作者:行者123 更新时间:2023-12-01 18:03:45 24 4
gpt4 key购买 nike

简单地说,我想知道这是否会改变行为。我假设是的,因为调用 someMethod() 将锁定整个对象,而不仅仅是列表对象?但我对同步方面的东西还很陌生,所以我想要一些更有根据的反馈。

之前:

public void run() {
int i = 0;

while (!end) {
synchronized (list) {
while (list.size() == i) {
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

之后:

public void run() {
int i = 0;

while (!end) {
synchronized (list) {
while (list.size() == i) {
someMethod();
}
}
}
}

public synchronized void someMethod() {
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

最佳答案

你是对的 - 新代码具有不同的语义,因为 someMethod() 确实在调用它的实例上同步(因此,该同步与该同步完全无关)在列表上)。但是,对 someMethod() 的调用将在 list 上的监视器被持有时发生,因此对 run() 的调用是“对于list来说同样是线程安全的”。

另一方面,您现在引入了多个线程同时直接调用 someMethod() 的可能性。由于对象本身的额外同步,您还引入了与其他线程发生死锁的(可能不必要的)可能性。我会推荐这个:

public void someMethod() {
synchronized (list) {
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

此方法现在对于个人使用和通过 run() 调用都是安全的 - 请注意,在已同步的对象上进行同步是安全的;线程不会自行阻塞。

关于java - 从同步块(synchronized block)调用这个同步方法可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557031/

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