我有一个类Cache
,它从数据库中获取List<SomeObject> someObjectList
并将其存储在静态变量中。
现在我有另一个使用此List的线程A,如下所示
class A extends Thread{
private List<SomeObject> somobjLst;
public A(){
somobjLst = Cache.getSomeObjectList();
}
void run(){
//somobjLst used in a loop here, no additong are done it , but its value is used
}
}
Cache.someObjectList
,它将反映在A类中。我认为它应该只有A才能对它有所了解。Cache.someObjectList
的内容发生变化时,A代码是否会出现任何问题?编辑: 根据建议: 如果我做
void run (){
while(true){
synchronized(someObjList){
}
try{
Thread.sleep(INTERVAL);
}catch(Exception e){
}
}
}
这会解决问题吗?
答案 0 :(得分:3)
是的,更改也会反映在课程A
中。正如您所说:A
将引用保存到与Cache
完全相同的对象。
是的,如果A
不希望它发生变化, 会导致问题。如果List
实现不是线程安全的,那么也会导致问题(大多数通用实现不是线程安全的!)。同时从两个线程访问非线程安全的数据结构可能会导致非常讨厌的问题。
答案 1 :(得分:1)
当然,你在线程中持有对集合的引用。如果在您在线程ConcurrentModificationException
中迭代它时更改了集合,则会抛出。
要避免它,您必须使用某种同步机制。例如,使用synchronize(collection)
同步迭代集合及其在其他线程中完成的修改。
这是一种“悲观”锁定。
其他可能性是使用java.util.concurrent
包中的集合。