java - 两个线程怎么会同时进入synchronized block 呢?

标签 java multithreading synchronized

发生了一些奇怪的事情。当我进入同步块(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/

相关文章:

java - 以小端方式编写协议(protocol)头以进行连线 - Java 中的干净方法?

java - 删除所有空行

java.lang.IllegalStateException : null with iterator

ios - 在调度 block 中分配的变量返回 null

java - 如何测试非线程安全类?

java - java 中的暂停、恢复和停止线程

java - Tomcat clientendpoint websocket不断关闭

java - Akka 中的轻量级线程

java - 更好的解决方案而不是 Java 中的嵌套同步块(synchronized block)?

java - 使用同步但结果 IllegalMonitorStateException 从另一个类通知线程