发生了一些奇怪的事情。当我进入同步块(synchronized block)时,我尝试打印线程的名称。在打印语句之后,我暂停了 100000 秒。
@Override
public int getNextAvailableVm() {
synchronized(this) {
System.out.println(Thread.currentThread().getName());
try {Thread.sleep(100000000);}catch(Exception exc){}
String dataCenter = dcc.getDataCenterName();
int totalVMs = Temp_Algo_Static_Var.vmCountMap.get(dataCenter);
AlgoHelper ah = (AlgoHelper)Temp_Algo_Static_Var.map.get(dataCenter);
.
.
.
}
}
但是当这个方法运行时,2 个线程的名字会被打印出来。
Thread-11
Thread-13
在此之后,长时间的停顿发生了。这是为什么 ?当第一个线程还没有离开同步块(synchronized block)时,两个线程怎么会进入同步块(synchronized block)?
最佳答案
如果两个线程针对同一个对象运行,则不应发生这种情况。
因此,我建议为每个线程创建一个新对象,或者至少一些线程在不同的对象上运行。
如果你确实想要多个对象,那么你应该不使用synchronized(this)
,你应该创建一个static final Object
到同步
。请不要在 this.getClass()
上同步,因为它会中断。
关于java - 两个线程怎么会同时进入synchronized block 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18696565/