Java多线程 - 访问A"锁定"时真正发生的事情宾语?

时间:2015-06-07 05:53:15

标签: java multithreading locking synchronized

给定在包装类中定义和初始化的以下对象:

// (thread-safe) List of Requests made by users
private static List<Request> requests = Collections.synchronizedList(new ArrayList<Request>());

在更新循环中不断调用以下代码:

// <-- (Thread 1 executes the following code @ Runtime=1.0000000ms)
    synchronized(requests) {
        for (Request request : requests)
            request.handle();
        requests.clear();
    }

这也会发生&#34;同时&#34;。

// (Thread 2 executes the following code also @ Runtime=1.0000000ms)
    synchronized(requests) {
        (requests.add(new Request());
    }

我的理解是,在这种情况下保证会发生以下情况:其中一个线程将成功锁定请求List,执行其各自的任务,并在退出同步块时释放其锁定。

在我理解&#34;线程安全&#34;时,对我来说,事情变得奇怪。让我们说线程1已经在请求列表上实现了锁定并且首先进入了它的同步块,尽管线程2试图做同样的事情。

1)由于未实现对象的同步性而无法调用的同步块内部代码会发生什么?(在这种情况下,使用线程2和新请求( )此线程正在尝试添加到List - 它发生了什么? - 请求只是 poof 并且从未添加到请求列表,因为线程1已锁定对象?

2)线程2是否真的在等待线程1释放其锁定,在发生这种情况时,线程2会重新审视对象并添加请求?(假设陷阱)如果这是如果线程1花费60秒对List中的所有Request对象执行handle() - 导致线程2等待60秒?该怎么办?

奖金问题)关于Collections.synchronizedList的1&amp; 2的答案是否遵循与ConcurrentHashMap相同的行为?

1 个答案:

答案 0 :(得分:2)

  

1)由于未实现对象的同步性而无法调用的同步块内部代码会发生什么?

其他线程将被阻塞,直到获取的线程释放锁定。之后,保持线程释放锁定,任何等待的线程都可以获取它。获得锁定的人可以继续其他人必须再次等待。

  

2)线程2是否在字面上等待线程1释放其锁定,在发生这种情况时,线程2会重新审视对象并添加请求?

是线程2必须等到线程1释放锁定。只有这样它才能获得锁定。

每个锁都有一个关联的监视器,用于管理谁可以访问与锁相关联的关键区域。一次只有一个线程可以获取此监视器并可以访问相关的关键区域。所有其他线程都必须等待获取监视器。