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

开源_节流 发布于 2015/06/09 08:51
阅读 215
收藏 0

代码列表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中的又不是线程安全的呢?



加载中
0
guor
guor

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

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

0
w
wangmingchen

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

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


0
开源_节流

@guor

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

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

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

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

返回顶部
顶部