如果监视器已被锁定,java 中的同步块请求会发生什么情况?

what will happen to the request for synchronized block in java if monitor is already locked?

如果当前线程持有监视器,来自不同线程的同步块请求会发生什么? 例子: 下面说的是同步块:

ABC.java:

public class ABC {

    ...
    public void setValue(){
        Example object = Example.getinstance();
        // Example is a singleton class which maintains the arraylist of objects of class ABC 
        synchronized (object) {
            object.storeObject(this);
        }
    }

    ...
}

假设有三个线程 T1、T2、T3 正在为 ABC 创建对象 class 例如:obj1、obj2、obj3。并且所有三个对象都在调用 ABC class 的 setValue 方法: 例子: Thread T1: obj1.setValue() Thread T2: obj2.setValue() Thread T3: obj3.setValue()

如果第一个请求(线程 T1)正在处理中,请求(T2 和 T3)会怎样?会不会被拒绝,或者其他线程会被挂起或排队?如果被拒绝或暂停,如何处理所有请求?

第一个命中同步块的线程将进入它。其余的将阻塞,直到第一个存在块。然后另一个线程将获取锁,剩下的等待,依此类推。

一个线程一次获取锁。如果锁已经被占用,任何其他请求线程都会阻塞——也就是说,暂停执行——直到锁被释放。您可以将其视为 "queueing up",请记住,实际情况并非如此:与 synchronized 关键字一起使用的内在锁是不公平的,由 OS 调度程序决定哪个线程运行第一的。它不必根据谁先请求来选择,它可以选择等待该锁的任何线程。

在您的示例中,线程都将有机会获得锁(none 个线程被拒之门外或超时),但不知道它们将以什么顺序执行。

唯一可以请求并获得对象锁的线程是已经拥有锁的线程,任何其他线程都必须等到锁被锁定 freed.You 可能想了解更多关于 re -进入者锁也是如此。

下面的代码不会导致死锁。

同步(锁定){

callTheLogic();

}

void callTheLogic(){

同步(锁定){

}