java中同步块之后的代码

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) 不在同步块中。

Nat*_*hes 7

现在,我想知道当线程 A 等待“this”锁对象时,执行是否会从 B 的 nameList.add(name) 方法恢复 - 因为 nameList.add(name) 不在同步块中。

不,执行该方法的线程不能只是跳过该块并执行该方法的其余部分。它将执行的操作是阻塞,直到可以获取 上的监视器this,然后执行同步块,然后释放 上的监视器this,然后将字符串添加到 nameList 中。

如果并发线程执行此操作,则无法保证哪些线程将首先插入 nameList 中。在线程释放监视器的时间this和将其添加到 nameList 的时间之间,一个或多个其他线程可能会闯入并添加到列表中。

此外,无论实现什么 nameList 都需要是一个线程安全的集合,以便并发更改不会导致错误,并且更改在线程之间可见。例如,如果 nameList 是 ArrayList 或 HashSet,那么这将不安全。