《java并发编程实战》中关于基本类型的论述是否前后矛盾呢?

《java并发编程实战》中关于基本类型的论述是否前后矛盾呢?

心舞飞扬 发布于 2021-11-25 字数 1657 浏览 950 回复 6

代码列表3-2

@NotThreadSafe
public class MutableInteger {
private int value;
public int get() { return value; }
public void set(int value) { this.value = value; }
}

有关这段代码的论述

MutableInteger in Listing 3.2 is not thread-safe because the value field is
accessed from both get and set without synchronization. Among other hazards,
it is susceptible to stale values: if one thread calls set, other threads calling get
may or may not see that update.

————————————————————————————————

代码列表3-9

public int loadTheArk(Collection<Animal> candidates) {
SortedSet<Animal> animals;
int numPairs = 0;
Animal candidate = null;
// animals confined to method, don’t let them escape!
animals = new TreeSet<Animal>(new SpeciesGenderComparator());
animals.addAll(candidates);
for (Animal a : animals) {
if (candidate == null || !candidate.isPotentialMate(a))
candidate = a;
else {
ark.load(new AnimalPair(candidate, a));
++numPairs;
candidate = null;
}
}
return numPairs;
}

关于代码列表3-9的论述

For primitively typed local variables, such as numPairs in loadTheArk in Listing
3.9, you cannot violate stack confinement even if you tried. There is no way to
obtain a reference to a primitive variable, so the language semantics ensure that
primitive local variables are always stack confined.

按照字面的理解,似乎是说类型为基本类型比如int的局部变量,是线程安全的。那怎么说代码列表3-2中的又不是线程安全的呢?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

坚持沉默 2021-12-01 6 楼

3.2 中的value是成员变量,被所有线程共享,但是没有同步,因此是非线程安全的。(具体来说貌似就是线程会把value的值拷到自己的本地栈中,然后再某个时刻再更新回公共内存)

3.9中的numPairs是局部变量,线程跑这个方法的时候有各自独立的一个numPairs,压根就没有并发问题

夜无邪 2021-12-01 5 楼

such as numPairs in loadTheArk. 指的就是numPairs变量哈,多个线程,或者同一个线程多次进入这个方法,这个变量都是新的,就不存在线程安全的问题了

归属感 2021-11-29 4 楼

@guor

你说的3-2是全局变量,3-9是局部变量是指哪个变量呢?

长安忆 2021-11-29 3 楼

3-2中不是线程安全的,多个线程可以同时更新同一个对象的同一个成员变量;

局部变量存储在线程自己的栈中。不会被多个线程共享。

#FFFFFF;">666666;font-family:Arial, Helvetica, sans-serif;font-size:14px;line-height:35px;background-color:#FFFFFF;">

奈何桥上唱咆哮 2021-11-29 1 楼

3-2是全局变量,3-9是局部变量,这点有区别的。

关于是否线程安全,你就想多个线程并发访问的时候,访问的是不是同一个变量,如果是,那么再考虑是不是做了互斥访问。