如果当前线程持有监视器,来自不同线程的同步块(synchronized block)请求会发生什么? 例子: 下面说的是同步块(synchronized block):
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 类创建对象,例如:obj1、obj2、obj3。所有三个对象都调用 ABC 类的 setValue 方法:
例子:
线程 T1:obj1.setValue()
线程 T2:obj2.setValue()
线程T3:obj3.setValue()
如果第一个请求(线程 T1)正在处理中,请求(T2 和 T3)会发生什么情况?会被拒绝,或者其他线程会被挂起或排队吗?如果被拒绝或暂停,如何处理所有请求?
最佳答案
一次一个线程获取锁。如果锁已被占用,则任何其他请求线程都会阻塞(即暂停执行),直到锁被释放。您可以将其视为“排队”,请记住,这并不完全是所发生的情况:与synchronized关键字一起使用的内在锁是不公平的,由操作系统调度程序决定哪个线程先执行。它不必根据首先询问的人进行选择,它可以选择正在等待该锁的任何线程。
在您的示例中,线程都有机会获取锁(它们都不会被拒绝或超时),但不知道它们将以什么顺序执行。
关于java - 如果监视器已经锁定,那么在java中对同步块(synchronized block)的请求会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010904/