Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步方法的最佳方法_Java_Multithreading_Spring_Spring Mvc - Fatal编程技术网

Java 同步方法的最佳方法

Java 同步方法的最佳方法,java,multithreading,spring,spring-mvc,Java,Multithreading,Spring,Spring Mvc,我正在开发一个任务管理类型的应用程序。因此,当某人完成任务时,任务创建者会通过电子邮件发送一条带有任务URL的消息。我正在使用SpringMVC创建这个应用程序。所以现在的问题是,当两个任务几乎同时创建时,第一个任务的电子邮件会生成第二个任务的URL 我编写了以下方法来执行此功能 @RequestMapping(value = "commentTask", method = RequestMethod.POST) @ResponseBody public List<List<Tas

我正在开发一个任务管理类型的应用程序。因此,当某人完成任务时,任务创建者会通过电子邮件发送一条带有任务URL的消息。我正在使用SpringMVC创建这个应用程序。所以现在的问题是,当两个任务几乎同时创建时,第一个任务的电子邮件会生成第二个任务的URL

我编写了以下方法来执行此功能

 @RequestMapping(value = "commentTask", method = RequestMethod.POST)
@ResponseBody public List<List<Task>> reply(@ModelAttribute Task task,@RequestParam ("parentId") long parentId,HttpSession session) {
    List<List<Task>> listTasks = null;

    taskEntryService.insertTask(task,session);

    listTasks = taskEntryService.selectAssignedTask(task.getAssignTo(), parentId);

    String taskurl = siteUrl + "showAssignedTask?assignto="+ task.getAssignTo() + "&taskId="+parentId; 

    if(task.getTaskUpdateEmailNotify().equalsIgnoreCase("1")){

            try {

                if(task.getStatus() == 4){

                    String completedTaskBody = taskCompletedEmailBody(taskurl, task.getAssignToName(), task.getTaskTitle(), task.getAssignerName(), task.getSummary()); 

                    sendmailService.sendMail("no-reply@gmail.com", task.getTaskCreatorEmail(), "Your Task has been Completed", completedTaskBody);
            }
            } catch (AddressException e) {
                e.printStackTrace();
            }

    }

    return listTasks;
}
@RequestMapping(value=“commentTask”,method=RequestMethod.POST)
@ResponseBy公共列表应答(@ModelAttribute任务,@RequestParam(“parentId”)长parentId,HttpSession会话){
List listTasks=null;
insertTask(任务,会话);
listTasks=taskEntryService.selectAssignedTask(task.getAssignTo(),parentId);
字符串taskurl=siteUrl+“showsassignedtask?assignto=“+task.getAssignTo()+”&taskId=“+parentId;
if(task.getTaskUpdateEmailNotify().equalsIgnoreCase(“1”)){
试一试{
if(task.getStatus()==4){
String completedTaskBody=taskCompletedEmailBody(taskurl、task.getAssignToName()、task.getTaskTitle()、task.getAssignerName()、task.getSummary());
sendmailService.sendMail(“否-reply@gmail.com,task.gettaskCreateMail(),“您的任务已完成”,completedTaskBody);
}
}捕获(地址e){
e、 printStackTrace();
}
}
返回列表任务;
}
那么,同步此方法的最佳方法是什么呢


如果需要更多详细信息,请告知我

同步访问此方法的最简单方法当然是在签名中将其标记为
已同步

 @RequestMapping(value = "commentTask", method = RequestMethod.POST)
 @ResponseBody
 public synchronized List<List<Task>> reply(@ModelAttribute Task task,
      @RequestParam ("parentId") long parentId,
      HttpSession session) {
@RequestMapping(value=“commentTask”,method=RequestMethod.POST)
@应答器
公共同步列表回复(@modeldattribute Task,
@RequestParam(“parentId”)长parentId,
HttpSession(会话){

在我看来,这里的同步不太可能解决您的问题,因为代码似乎没有任何特定的竞争条件:它会小心地从提供的
任务
对象构造完整的URL。我怀疑您的
任务
对象不是线程安全的,或者是错误的
parentId
正在传入。

sendmailService的类型是什么,类是线程安全的吗?对于
taskEntryService
也是如此。如何调用此方法?用户是否单击URL?是否确定此方法没有被错误的
任务调用(可能是前端的错误)?@EmilSit此方法是当有人回复创建的任务时使用的。因此,此方法将值存储在数据库中并向任务创建者发送电子邮件。当有人同时回复任务时,这种情况只会发生一次,否则工作正常。@Zim-ZamO'Pootertoot请查找我的更新代码我正在使用jmail sender发送电子邮件感谢您的回复。h我怎么会发现此方法没有任何竞争条件。我通过同时注释任务再次尝试,但这种情况不会再次发生在我身上,但我担心任务数据如何交换您在该方法中没有调用任何
task
mutator(至少,假设
get
方法不发生变异),所以在我看来,这种方法不太可能发生任何竞争。嗨,Emil,很抱歉反应太晚。我想你是对的,我的任务对象不是线程安全的。你能帮我如何使我的任务对象线程化吗-safe@user965884你应该问一个新问题,包括
任务
类的代码,也许还有rele使用它的vant代码。如果你对这个答案满意,你可以接受它。