java中同步块后的代码

时间:2016-01-12 15:52:56

标签: java multithreading synchronization

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

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

3 个答案:

答案 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范围内的代码;

假设超出范围的操作是编写操作,您(通常)希望它synchronized减少任何可能出现异常的异常。

答案 2 :(得分:0)

如果另一个线程在此块内,

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