两个线程如何同时进入同步块?

Suh*_*pta 2 java multithreading synchronized

发生了一些奇怪的事情。当我进入同步块时,我尝试打印线程的名称。在打印语句之后,我暂停了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);
        .
        .
        .
   }
}
Run Code Online (Sandbox Code Playgroud)

但是在运行此方法时,将打印两个线程的名称。

Thread-11
Thread-13
Run Code Online (Sandbox Code Playgroud)

在此之后,会出现长时间的停顿。这是为什么 ?当第一个线程尚未离开同步块时,两个线程如何进入同步块?

Old*_*eon 5

如果两个线程针对同一个对象运行,则不应发生这种情况。

因此,我建议您为每个线程创建一个新对象,或者至少某些线程在不同的对象上运行。

如果你想多个对象,那么你应该不会synchronized(this),你应该创建一个static final Objectsynchronize上。请不要同步,this.getClass()因为这样会中断。

  • @JensSchauder-如果您在`this.getClass`上进行同步,则当这些对象中的任何一个同步时,该类型的所有对象都会被阻塞。而且,对象的子类也将无法正确地与超类的对象同步。几乎可以肯定这不是您想要的。 (2认同)