java - 如果监视器已经锁定,那么在java中对同步块(synchronized block)的请求会发生什么?

标签 java multithreading synchronization synchronized

如果当前线程持有监视器,来自不同线程的同步块(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/

相关文章:

java - 处理 JSP page/customerLogin.jsp 行时发生异常

java - 使用 jar 文件从命令行运行 junit

c - 在 x86-64 上被认为是原子的 C 程序中分配一个指针

c - 具有循环缓冲区的多生产者单消费者

go - 这对并发访问是线程安全的吗?

node.js - express/node.js 中请求之间的同步问题

Java 设计,如何避免将对象向下传递到层次结构中?!?不可能的?

java - Sparql 查询是否重复我不明白

c - 关键部分中使用的资源是否需要 volatile?

java - 为什么没有调用run方法?