使用变量引用指向其他类的静态成员

时间:2011-08-02 14:43:20

标签: java reference

我有一个类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
 }
}
  1. 现在,如果在某个时间点,如果某些对象被添加到Cache.someObjectList,它将反映在A类中。我认为它应该只有A才能对它有所了解。
  2. Cache.someObjectList的内容发生变化时,A代码是否会出现任何问题?
  3. 编辑: 根据建议: 如果我做

      void run (){
      while(true){
         synchronized(someObjList){
    
    
        }
         try{
         Thread.sleep(INTERVAL);
         }catch(Exception e){
         }
      }
     }
    


    这会解决问题吗?

2 个答案:

答案 0 :(得分:3)

  1. 是的,更改也会反映在课程A中。正如您所说:A引用保存到与Cache完全相同的对象。

  2. 是的,如果A不希望它发生变化, 会导致问题。如果List实现不是线程安全的,那么会导致问题(大多数通用实现不是线程安全的!)。同时从两个线程访问非线程安全的数据结构可能会导致非常讨厌的问题。

答案 1 :(得分:1)

当然,你在线程中持有对集合的引用。如果在您在线程ConcurrentModificationException中迭代它时更改了集合,则会抛出。

要避免它,您必须使用某种同步机制。例如,使用synchronize(collection)同步迭代集合及其在其他线程中完成的修改。

这是一种“悲观”锁定。

其他可能性是使用java.util.concurrent包中的集合。