gpt4 book ai didi

java - java中同步块(synchronized block)之后的代码

转载 作者:行者123 更新时间:2023-11-30 07:40:44 25 4
gpt4 key购买 nike

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

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

nameList.add(name);
}

同步后的代码怎么样。堵在这里?我的意思是同步。 block 用于减少锁定范围,但这里后面的代码( namelist.add(name) )将被阻止,对吗?

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

最佳答案

Now, I wondered if the execution will resume from B's nameList.add(name) method while thread A is waiting on 'this' lock object - since nameList.add(name) is not in the sync block.

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com