我有一个简单的问题,但无法找到正确的答案。想象我们有;

public void addName(String name) {
    synchronized(this) {
        lastName = name;
        nameCount++;
    }

    nameList.add(name);
}


同步后的代码呢?在这里阻止?我的意思是同步。块用于减小锁定范围,但此处的代码(namelist.add(name))将被阻止,对吗?

假设线程A在上面调用了此函数,但是它将等待线程B释放“此”锁,而线程B之前在其他方法上已经拥有该锁。现在,我想知道线程A在等待“此”锁定对象时是否将从B的nameList.add(name)方法恢复执行-因为nameList.add(name)不在同步块中。

最佳答案

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


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

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

同样,根据需要实现的nameList都必须是线程安全的集合,以便并发更改不会导致错误,并且更改在线程之间可见。例如,如果nameList是ArrayList或HashSet,那么这将是不安全的。

关于java - Java中的同步块(synchronized block)后的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34748129/

10-11 10:38