我搜索并发现分配对象是线程安全的(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 } }}据我所知,当 Reader 在 for 循环中读取共享 List 时,Writer 线程可以在线程安全中分配共享 List。在这种情况下,Reader 线程仍然可以使用旧的共享 List 对象在 for 循环中读取共享 List。当 Reader 线程稍后尝试执行 run() 函数时,它将读取新的共享 List 对象。这样对吗?
1 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
这段代码是错误的。线
List temp = SharedAnyClass.obj;可以在分配之前发生
SharedAnyClass.obj= temp; // assign object in thread 1所以会读取初始的空列表。
添加回答
举报
0/150
提交
取消