【发布时间】:2014-04-13 08:27:28
【问题描述】:
我有一个列表列表,我想做的是创建读取对象(列表)并将其从“sharedList”中删除的线程,如何使列表线程安全?我正在使用 synchronizedList ,但是如果一个线程被删除和对象而另一个线程正在读取另一个对象怎么办?因为 .remove 将对象向左移动 ....
填充类
public class DataFetcher implements Runnable {
Session session = null;
Criteria criteria = null;
private List<Parts> partList = null;
public DataFetcher() {
}
@Override
public void run() {
// while(true)
List newPartList =getNParts(DBIndexGuard.getAllowedListSize());
SharedList.addPartList(newPartList);
}
public List<Parts> getNParts(int listSize) {
try {
session = HibernateUtils.getSessionFactory().openSession();
criteria = ....
// *********** SYNCHRONIZATION OCCURS HERE ********************//
criteria.setFirstResult(DBIndexGuard.getNextIndex());
criteria.setMaxResults(listSize);
partList = criteria.list();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return partList;
}
}
sharedList 类
public class SharedList {
private static final List<List<Parts>> sharedList = Collections.synchronizedList(new ArrayList());
public List<List<Parts>> SharedList() {
return sharedList;
}
static synchronized void addPartList(List partList) {
sharedList.add(partList);
}
static synchronized List getPartList(int index) {
return sharedList.get(index);
}
static synchronized void removePartList(int index) {
sharedList.remove(index);
}
}
工作线程
public class Finder implements Runnable {
private List<Parts> partList = null;
public Finder () {
}
@Override
public void run() {
operateOnList(partList);
}
public void operateOnList(List<Parts> partList) {
for (Parts part : partList) {
}
}
}
我将创建多个查找器来处理 sharedList
【问题讨论】:
-
我们不能在没有看到任何一行代码的情况下评论某些代码的线程安全性。邮政编码。
-
您应该意识到的第一件事是 Hibernate 实体不是线程安全的,因此不应从多个线程访问。
-
是的,没关系,假设现在只有 1 个线程用于休眠,我如何同时管理 sharedList 上的读/写操作?
-
Hibernate 不仅仅是一个线程,因为您将 Hibernate 实体存储在一个共享列表中。 sharedList 是同步的,因此它是线程安全的。不是它包含的列表。但不清楚您是否从多个线程访问它们。
-
正在做的是......从数据库中获取页面,将它们存储在“小列表”中并将小列表存储在更大的列表中,线程正在为大列表读取
标签: java multithreading arraylist