我搜索并發現分配對象是線程安全的(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
提交
取消