以下代码如果'commonSet'变量是类级别字段,是否会导致相同的问题。如果它是类级别字段,我将不得不在添加到集合操作中包装一个同步块,因为HashSet不是线程安全的。由于多个线程正在添加到该集合,甚至当前线程可能会继续改变该集合,因此我应该在以下代码中执行相同的操作吗?请注意,保留HTML标签。
对于'commonSet'的引用使用了final进行了'锁定'。但是多个线程操作它仍然可能会破坏集合中的值(它可能包含重复项?)。其次,混淆在于'commonSet'是一个方法级别变量 - 它的相同引用将在调用方法(threadCreatorFunction)的堆栈内存和run方法的堆栈内存上 - 这是正确的吗?
与此相关的问题有很多:
- 为什么传递给runnable的变量需要是final的? - 为什么只有final变量可以在匿名类中访问? 但是,我没有看到他们强调这种共享/传递可变对象的线程安全性。
public void threadCreatorFunction(final String[] args) {
final Set<String> commonSet = new HashSet<String>();
final Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
commonSet.add(newValue());
}
}
};
new Thread(runnable, "T_A").start();
new Thread(runnable, "T_B").start();
}
对于'commonSet'的引用使用了final进行了'锁定'。但是多个线程操作它仍然可能会破坏集合中的值(它可能包含重复项?)。其次,混淆在于'commonSet'是一个方法级别变量 - 它的相同引用将在调用方法(threadCreatorFunction)的堆栈内存和run方法的堆栈内存上 - 这是正确的吗?
与此相关的问题有很多:
- 为什么传递给runnable的变量需要是final的? - 为什么只有final变量可以在匿名类中访问? 但是,我没有看到他们强调这种共享/传递可变对象的线程安全性。