我有一个简单的问题但无法找到合适的答案。想象一下,我们有;
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
同步后的代码怎么样?挡在这里?我的意思是同步。块用于减少锁定范围,但这里的代码(namelist.add(name))将被阻止,对吧?
假设线程A在上面调用了这个函数,但它会等待'this'锁被线程B释放,而线程B之前已经锁定了其他一些方法。现在,我想知道执行是否会从B的nameList.add(name)方法恢复,而线程A正在等待'this'锁定对象 - 因为nameList.add(name)不在同步块中。
答案 0 :(得分:1)
现在,我想知道执行是否会从B&#39的nameList.add(name)方法恢复,而线程A正在等待这个'这个'锁定对象 - 因为nameList.add(name)不在同步块中。
不,执行该方法的线程不能跳过该块并执行该方法的剩余部分。它将做什么阻止,直到它可以在this
上获取监视器,然后执行synchronized块,然后在this
上释放监视器,然后将该字符串添加到nameList。
如果并发线程执行此操作,则无法保证哪些线程将首先插入到nameList中。可能是在线程在this
上释放监视器的时间与它添加到nameList的时间之间,一个或多个其他线程可能会插入并添加到列表中。
无论nameList被实现为什么都需要是一个线程安全的集合,因此并发更改不会导致错误,因此跨线程可以看到更改。例如,如果nameList是ArrayList或HashSet,那么这将是不安全的。
答案 1 :(得分:0)
原则上,关键字synchronized
会执行以下两项操作:
..它控制线程之间数据(变量)的可见性;
在您的示例中,调用此方法的所有其他线程都可以访问不在synchronized
范围内的代码;
假设超出范围的操作是编写操作,您(通常)希望它synchronized
减少任何可能出现异常的异常。
答案 2 :(得分:0)
synchronized(this)
将阻止。如果线程离开此块,则一个等待线程有机会(在其他等待线程中)进入该块。 namelist.add()
在同步范围之外执行,因此它可以与其他线程并行执行。