【发布时间】:2023-03-25 15:16:01
【问题描述】:
我在这里运行 safe1 方法时遇到了一些多线程问题:
public class Test {
private static final Object lock = new Object();
public void safe1() {
//Some non thread safe code
synchronized (lock) {
//Some thread safe code
}
//Some non thread safe code.
}
public void safe2() {
//Some non thread safe code
synchronized (lock) {
//Some thread safe code
}
//Some non thread safe code.
}
}
我认为它的行为与这段代码相同。
public class Test {
public void safe1() {
//Some non thread safe code
synchronized (Test.class) {
//Some thread safe code
}
//Some non thread safe code.
}
public void safe2() {
//Some non thread safe code
synchronized (Test.class) {
//Some thread safe code
}
//Some non thread safe code.
}
}
正确吗? 我想确保没有 2 个线程在 VM 范围内运行相同的“安全代码”。
【问题讨论】:
-
取决于是否有其他代码尝试在同一个对象或类上同步。
-
@khelwood 你能详细说明一下吗?我有很多类型测试运行的实例。我想确保没有 2 个线程在 VM 范围内运行相同的“安全代码”。同步(锁)和同步(Test.class)一样吗?
-
您是否有任何 other 代码执行
synchronized (Test.class)或 Test 类上的同步静态方法,或 Test 类中使用lock对象的任何其他方法?如果是这样,那么safe1和safe2是不同的,因为它们将与不同的其他代码共享锁。 -
@khelwood 我还有其他几种使用同步(锁定)的方法。我没有混合同步的方法。所以真正的问题是:使用同步(lock)的一组方法是否与使用同步(Test.class)的一组方法相同。我将使用其中一种方法,而不是两种方法。
-
如果所有代码都使用同一个锁,那么据我所知,锁是类还是对象并不重要。如果某些代码更改为使用不同的锁,而其他代码仍使用相同的锁,那么您将有不同的行为,因为共享锁的两件事与拥有不同锁的两件事不同。
标签: java multithreading locking monitor