【发布时间】:2013-09-12 20:14:49
【问题描述】:
发生了一些奇怪的事情。当我进入同步块时,我尝试打印线程的名称。在打印语句之后,我暂停了 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
在此之后出现长时间的停顿。这是为什么 ?当第一个线程尚未离开同步块时,两个线程如何进入同步块?
【问题讨论】:
-
你确定你在同一个对象上调用
getNextAvailableVm()吗? -
你确定你的睡眠没有被打扰? (在异常块中打印一些东西)
-
@njzk2 没有从异常块中打印出来
-
@SuhailGupta : 可能是因为没有打印声明?
-
@rocketboy 评论可能是你的问题。如果在同一个对象上正确同步,则没有理由应该由多个线程访问该块
标签: java multithreading synchronized