gpt4 book ai didi

java - 同时处理多个请求

转载 作者:行者123 更新时间:2023-11-30 00:16:09 25 4
gpt4 key购买 nike

我在 MySQL 中有一个表 Users,包含 3 个字段:ID (int)、Name (varchar) 和 UpdateTime (TimeStamp)。我有一个java web应用程序和一个函数来获取表Users中的一条记录,之后检查UpdateTime是否在当前时间之前 ---> 按当前时间加2小时更新UpdateTime。

我的问题是,当大约 100 个用户访问我的应用程序并请求该函数在同一时间获取相同的记录时,所有用户都会更新 UpdateTime。但我只想第一个用户更新UpdateTime,后来者只会获取数据而不更新UpdateTime。

我该怎么做?我真的不知道。

谢谢。

P/s:抱歉我的英语好像不太好:(

最佳答案

您的更新时间代码应该位于同步块(synchronized block)中。

对您的对象采取写锁定,如果有人在进行更新操作之前消耗了锁定,同时另一个请求到来,则应该获取预加载/更新后的数据。

java中的checksynchronized关键字也检查读写锁机制。这可能对您有帮助。

以下代码可能对您有帮助。

import java.util.Map;
import java.util.HashMap;


public class Test {
boolean isWriteLockTaken;
Map<Integer,String> cachedUsers = new HashMap<Integer,String>();

public static void main(String[] args) throws Exception {
Test t = new Test();
for(int i=0;i<10;i++){
t.updateAndGetUser(1);
}
}

public String updateAndGetUser(Integer id) throws InterruptedException {
if(isWriteLockTaken && !cachedUsers.containsKey(id)){
this.wait();
}

if(!cachedUsers.containsKey(id)){
isWriteLockTaken = true;
synchronized(id){
if(id==1){
// do processing to retrive user
System.out.println("Updating & loading user");
cachedUsers.put(id, "Gaurav");
return "Gaurav";
}
}
isWriteLockTaken = false;
}
System.out.println("returning from cached list, not loading user details as it is already loaded");
return cachedUsers.get(id);
}

}

谢谢,高拉夫

关于java - 同时处理多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23645088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com