繁体   English   中英

Java中同步块后的代码

[英]Code after synchronized block in java

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

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是ArrayList或HashSet,那么这将是不安全的。

原则上,关键字synchronized做以下两件事:

  • 由synced关键字保护的代码不能同时由多个线程执行;
  • ..它控制线程之间数据(变量)的可见性;

    在您的示例中,调用此方法的所有其他线程将可以访问不在synchronized范围内的代码。

假设超出范围的操作是写操作,则(通常)希望将其synchronized以减少可能爬升的任何异常。

如果另一个线程位于此块中,则synchronized(this)将被阻塞。 如果线程离开该块,则一个等待线程(在其他等待线程中)有机会进入该块。 namelist.add()在同步作用域之外执行,因此它可以与其他线程并行执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM