放入会话并具有动态getter的对象是否应该是线程安全的

时间:2016-02-02 10:36:08

标签: java session servlets synchronization

考虑在会话中设置的User对象。

其中一个对象属性是动态设置的,如下所示:

public class User() {
  private String FirstName;
  private String LastName;   
  private Car car;
  //Here we have the service object, this could be injected with spring or JEE
  private CarServices carServices;

  public Car getCar() {
    //If the car is not fetched yet, go on and get it from your service
    if (car == null) {
      car = carServices.getCarFromDB(...)
    }
    return car;
  }

}

getCar()应该同步吗?!

如果您想了解有关此设计的更多信息,请参阅Design a Java POJO with lazy loading property

1 个答案:

答案 0 :(得分:2)

简短回答:是的。如果同一用户(拥有会话的用户)同时发出多个请求,则会话中的User对象可能会被多个线程访问。

如果您不关心可能多次加载汽车,可能会导致car不稳定:

private volatile Car car;

或者,您当然可以同步整个方法。在这种情况下并行访问的可能性不大,因此无论如何都不应对性能产生重大影响。