【发布时间】:2013-12-07 15:26:09
【问题描述】:
我知道会话不是线程安全的。我的第一个问题:将实体传递给另一个线程是否安全,对其进行一些工作,然后将其传递回原始线程并进行更新。
public class Example1 {
MyDao dao;
...
public void doWork() {
MyEntity entity = dao.getEntity();
Runnable job = new Job(entity);
Thread t = new Thread(job);
t.run();
t.join();
dao.merge(entity);
}
}
我的第二个问题:在一个线程中新建一个实体并将其保存在另一个线程中是否安全?
public class Example2 {
MyDao dao;
...
public void doWork() {
MyEntity entity = new Entity();
new Thread(new Job(dao, entity)).run();
}
}
public class Job implements Runnable {
private MyDao dao;
private MyEntity entity;
...
@Override
public void run() {
dao.save(entity);
}
}
编辑我忘了提到实体是专门为预先加载而配置的
【问题讨论】:
-
第二个例子肯定是不安全的——我想你也会得到一个异常,因为你在 DAO 中使用的会话绑定到另一个线程而不是你的 Job。关于第一个我不确定。
-
我实现它的方式,MyDao.merge() 本质上是
sessionFactory.getCurrentSession.merge(entity);所以它使用会话绑定到调用它的线程。 -
您为什么对创建自己的主题感兴趣?
-
我正在“外包”给其他线程,因为这项工作很容易并行化,并且每个单独任务的瓶颈是网络延迟。这个的真实版本使用线程池
标签: java multithreading hibernate