【发布时间】:2012-06-29 12:35:11
【问题描述】:
您好,我有一个包含多个方法的类,其中我需要在所有方法中使用同步块,如下所示:
public class Test2 {
private Object mutex=new Object();
private OtherClass obj=new OtherClass();
public void method1(){
//do some stuff
synchronized (mutex) {
obj.//some method
//do some stuff
}
//do other stuff
}
public void method2(){
//do some stuff
synchronized (mutex) {
obj.//some method
//do some stuff
}
//do other stuff
}
public void method3(){
//do some stuff
synchronized (mutex) {
obj.//some method
//do some stuff
}
//do other stuff
}
public void method4(){
//do some stuff
synchronized (mutex) {
obj.//some method
//do some stuff
}
//do other stuff
}
}
我正在使用互斥锁来同步块,所以如果正在使用 method1 会发生什么,另一个 method2 同步块等待直到流从 method1 的同步块中流出。
我不希望这种情况发生,那我该怎么办?我知道,因为我对所有方法都使用互斥锁,所以它锁定了 method2 同步块。我想知道我应该怎么做才能删除它?我应该为每个要使用的方法创建成员变量,还是有其他方法可以解决这个问题?
我希望其他线程只有在调用相同的方法时才等待。就像两个线程类 mehod1 一样,第二个线程应该等待。但如果第二个线程调用 method2 它不应该等待。
【问题讨论】:
-
如果这不是您想要的行为,您希望
method2做什么?跳过街区?那么同步的不是你要找的…… -
我希望其他线程只有在调用相同的方法时才等待。就像两个线程类 mehod1 一样,所以第二个线程应该等待。但如果第二个线程调用 method2 它不应该等待。
-
投反对票 - 非常本地化的问题,即使作者在问题中提出了答案,答案也非常明显。
-
@Romain 好吧,他问是否有更好的方法。答案对你来说可能是微不足道的,但假设答案对每个人来说都是显而易见的,这是不正确的......
-
@brimborium 如果 Google 和 StackOverflow 还没有以某种方式回答这个问题十亿次,那么假设是不正确的。问题是他们这样做了。
标签: java multithreading synchronization