gpt4 book ai didi

java - 关于java临界区和锁,锁定对象/数据还是锁定代码?

转载 作者:行者123 更新时间:2023-12-01 17:13:55 25 4
gpt4 key购买 nike

 synchronized(foo){
//code
}

假设另一个线程使用另一个代码块来访问这个 foo 对象。然后会发生什么?

如果锁在 foo 对象上,那么即使代码不在这个临界区中,也无法访问 foo 对象。

如果锁位于该代码块上,则只有两个线程不能同时运行该代码块。但 foo 对象仍然可以通过使用 block 的另一个代码来访问。

锁定对象或锁定代码,哪个是正确的?

最佳答案

在对象上同步不会阻止任何线程访问该对象。它可以防止其他线程执行在同一对象上同步的任何代码块。

所以如果你有

public class Foo {
}

public class SharedState
private final Foo foo = new Foo();

private long value;

public void increment() {
synchronized (foo) {
value++;
}
}

public long getValue() {
synchronized (foo) {
return value;
}
}
}

然后,如果一个线程当前正在递增或获取该值,则其他线程将无法同时递增或读取该值。

如果添加一个方法

public Foo getFoo() {
return foo;
}

对于SharedState,任何线程都可以调用它,并同时调用 foo 的任何方法。

关于java - 关于java临界区和锁,锁定对象/数据还是锁定代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892189/

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