给定在包装类中定义和初始化的以下对象:
// (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相同的行为?
答案 0 :(得分:2)
1)由于未实现对象的同步性而无法调用的同步块内部代码会发生什么?
其他线程将被阻塞,直到获取的线程释放锁定。之后,保持线程释放锁定,任何等待的线程都可以获取它。获得锁定的人可以继续其他人必须再次等待。
2)线程2是否在字面上等待线程1释放其锁定,在发生这种情况时,线程2会重新审视对象并添加请求?
是线程2必须等到线程1释放锁定。只有这样它才能获得锁定。
每个锁都有一个关联的监视器,用于管理谁可以访问与锁相关联的关键区域。一次只有一个线程可以获取此监视器并可以访问相关的关键区域。所有其他线程都必须等待获取监视器。