【问题标题】:Two API in same controller trying to access one helper method at a time causes any multi thread issues同一控制器中的两个 API 尝试一次访问一个辅助方法会导致任何多线程问题
【发布时间】:2018-02-12 11:43:02
【问题描述】:

我有一个控制器,例如EmployeeController

findEmployeesByDepartmentfindLevelOneEmployeesByDepartment 正在使用一个通用的私有方法 getDepartmentId,它返回 Long

如果两个请求或线程访问这个私有方法,是否有可能改变这两个方法调用的值。

一个简单的疑问

@Controller
@RequestMapping("/emp")
public class EmployeeController {

    @RequestMapping("/emp/dept/")
    public Employee findEmployeesByDepartment(Department department) {
        Long id = getDepartmentId(department);
    }

    @RequestMapping("/emp/dept/")
    public Employee findLevelOneEmployeesByDepartment(Department department {
        Long id = getDepartmentId(department);
    }


    // private method
    private Long getDepartmentId(Department department) {
        ...
        return id;
    }
}

【问题讨论】:

  • 首先,请求映射 url 应该不同,不应该相同。之后您的疑问答案是“否”,因为仅基于您的 Department 对象才会针对特定请求对象发生更改。跨度>
  • 如果同时访问 findEmployeesByDepartment 和 findLevelOneEmployeesByDepartment 呢?
  • 两个请求都会得到相同的响应,因为您似乎正在获取数据。
  • 那么这是一种错误的做法,基本上,不同的Department对象作为参数发送,期望不同的id对吧?

标签: spring multithreading thread-safety


【解决方案1】:

getDepartmentId的不同调用具有不同的方法堆栈跟踪,它们位于不同的内存空间,这意味着它们是分开的。

所以,如果你没有

  • 在不同的Department之间共享任何变量
  • 使用getDepartmentId 中声明为类字段的任何变量

getDepartmentId 将是线程安全的。

示例

假设您希望每个新的 Department 都有一个增量 id,并且您在 getDepartmentId 中使用了一些共享变量而没有同步:

Long id = new Long(0);

private Long getDepartmentId(Department department){
    id++;
    return id;
}

他们可能得到相同的id,而不是加一。

在这种情况下,为了保证线程安全,你需要一些额外的操作,比如synchronized关键字:

private synchronized Long getDepartmentId(Department department){
    id++;
    return id;
}

【讨论】:

  • 谢谢,如果可能的话,请您举一些例子或详细说明这两点。 "所以,如果您没有在不同部门之间共享任何变量,请使用在 getDepartmentId 中声明为类字段的任何变量"
  • 太好了,谢谢,例如,如果在该方法中实例化了一个类,那么使用 ThreadLocal 会更好吗?类似于 private Long getDepartmentId(Department department){ Employee emp = new Employee(department) return emp.getId(); }
  • @CorkKochi 没必要。在方法中声明和实例化的对象是线程本地的。当它是类级变量时,你只需要显式声明它。
  • 好的,谢谢,有道理
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2017-06-03
  • 2021-12-06
相关资源
最近更新 更多