我搜索发现分配对象是线程安全的(long,double类型除外) 我想确认以下代码是线程安全的。
class SharedAnyClass {
public static volatile obj = new ArrayList();
}
class Writer {
// thread 1
void run() {
List temp = new ArrayList();
temp.add(xx);
SharedAnyClass.obj= temp; // assign object in thread 1
}
}
class Reader {
void run() {
List temp = SharedAnyClass.obj;
for ( int i=0;i<temp.length(); i++ ) {
temp.get(xx)... // read object in thread 2
}
}
}
据我所知, 当读者正在for循环中读取共享列表时, 编写器线程可以在线程安全中分配共享列表。 在这种情况下,Reader线程仍可以使用旧的共享List对象在for循环中读取共享List。 当Reader线程稍后尝试执行run()函数时,它将读取新的共享List对象。 这样对吗?
答案 0 :(得分:0)
此代码是错误的。线
List temp = SharedAnyClass.obj;
可以在分配之前发生
SharedAnyClass.obj= temp; // assign object in thread 1
,因此将读取初始的空列表。