std*_*out 4 java multithreading synchronization synchronized
我有一个简单的问题,但无法找到正确的答案。想象一下我们有;
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
Run Code Online (Sandbox Code Playgroud)
同步后的代码怎么样?堵在这里?我的意思是同步。块用于减少锁定范围,但这里后面的代码( namelist.add(name) )将被阻止,对吗?
假设线程 A 调用了上面的这个函数,但它将等待线程 B 释放“这个”锁,而线程 B 之前在其他方法上拥有过该锁。现在,我想知道当线程 A 等待“this”锁对象时,执行是否会从 B 的 nameList.add(name) 方法恢复 - 因为 nameList.add(name) 不在同步块中。
现在,我想知道当线程 A 等待“this”锁对象时,执行是否会从 B 的 nameList.add(name) 方法恢复 - 因为 nameList.add(name) 不在同步块中。
不,执行该方法的线程不能只是跳过该块并执行该方法的其余部分。它将执行的操作是阻塞,直到可以获取 上的监视器this,然后执行同步块,然后释放 上的监视器this,然后将字符串添加到 nameList 中。
如果并发线程执行此操作,则无法保证哪些线程将首先插入 nameList 中。在线程释放监视器的时间this和将其添加到 nameList 的时间之间,一个或多个其他线程可能会闯入并添加到列表中。
此外,无论实现什么 nameList 都需要是一个线程安全的集合,以便并发更改不会导致错误,并且更改在线程之间可见。例如,如果 nameList 是 ArrayList 或 HashSet,那么这将不安全。
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |