【发布时间】:2016-01-18 13:31:38
【问题描述】:
考虑一个场景:
MySessionObject object = Session.getObject();
//then object is passed to Runnable task.
private class MyTask implements Runnable {
private final MySessionObject object;
public SaveVisitorTask(MySessionObject object) {
this.object = object;
}
@Override
public void run() {
MyDao dao = new MyDao();
MySessionObject savedObject = dao.save(object);
this.object.setId(savedObject.getId());
}
}
说明:
- 从会话中检索的对象,例如线程局部变量。
- 然后将其传递给 Runnable 任务,在该任务中异步持久化
- 然后从保存的对象到线程局部变量中的对象设置新的 id。
问题很简单——代码线程安全吗?很明显,线程局部变量(会话)不能
共享给线程,但是它所拥有的引用呢? this.object.setId(savedObject.getId()); 语句是否影响原始对象?
P.S. 如果这段代码不是线程安全的(我个人相信),有人能解释一下原因吗?
【问题讨论】:
-
任何对象可以在线程之间共享。您所要做的就是将对该对象的引用放在多个线程可以看到它的地方。但是,在
ThreadLocal对象中存储对共享对象的引用,这不会有点违背ThreadLocal的目的吗?这肯定会违反最小惊讶原则。 programmers.stackexchange.com/questions/187457/…
标签: java multithreading spring session