java线程锁的问题,如何保证web应用中的synchronized用到同一个对象锁?
假设我要自己实现ID自增,我的代码这样写:publicclassObjClass{publicstaticObjectobj=newObject();}然后我在servl...
假设我要自己实现ID自增,我的代码这样写:
public class ObjClass{
public static Object obj = new Object();
}
然后我在servlet或jsp或spring的controller里面这样写:
synchronized(ObjClass.obj ){
//1、取出ID
//2、ID+1
//3、执行insert
}
我就是想实现我自己来管理ID的自增,我创建了一个类,给它设置了一个静态变量,这样来保证synchronized用到的是同一个object,以此来锁住只想让一个线程执行的代码。
这里的关键就在于,我的object在不同用户发起请求时,用到的是同一个object吗?
我的意思表达清楚了吗?
先抛开语法问题和效率问题,我想达到的保证ID只能单线程访问的效果能实现吗?如果不能实现,应该如何修改呢? 展开
public class ObjClass{
public static Object obj = new Object();
}
然后我在servlet或jsp或spring的controller里面这样写:
synchronized(ObjClass.obj ){
//1、取出ID
//2、ID+1
//3、执行insert
}
我就是想实现我自己来管理ID的自增,我创建了一个类,给它设置了一个静态变量,这样来保证synchronized用到的是同一个object,以此来锁住只想让一个线程执行的代码。
这里的关键就在于,我的object在不同用户发起请求时,用到的是同一个object吗?
我的意思表达清楚了吗?
先抛开语法问题和效率问题,我想达到的保证ID只能单线程访问的效果能实现吗?如果不能实现,应该如何修改呢? 展开
展开全部
//模拟服务器
public class MockServer {
private static int current = 0;
private static MockServer singleInstance;
// 同步
public static synchronized MockServer getInstance(){
if(singleInstance == null)
singleInstance = new MockServer();
return singleInstance;
}
private MockServer() {}
// 同步
public synchronized void AutoIncrease(String requestId){
System.out.println("recieve request " + requestId + " current " + current ++);
}
}
// 模拟20个客户端请求线程
public class MockClientsRequest {
public static void main(String[] args){
int requestCount = 20;
for(int i=0;i<requestCount;i++){
new Thread(String.valueOf(i)){
public void run(){
try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); }
MockServer.getInstance().AutoIncrease(this.getName());
}
}.start();
}
}
}
/*
假如把模拟服务器中两个同步方法的synchronized修饰符去掉
可以看到类似如下不同步的current id增长错误的结果
recieve request 9 current 0
recieve request 8 current 2
recieve request 11 current 1
recieve request 10 current 0
recieve request 7 current 3
recieve request 12 current 4
recieve request 13 current 5
recieve request 14 current 6
recieve request 15 current 7
recieve request 16 current 8
recieve request 17 current 9
recieve request 18 current 10
recieve request 19 current 11
recieve request 0 current 12
recieve request 2 current 13
recieve request 1 current 14
recieve request 3 current 15
recieve request 5 current 17
recieve request 4 current 16
recieve request 6 current 18
服务器线程同步后可以看到类似一下结果 current id 自增正常
recieve request 6 current 0
recieve request 5 current 1
recieve request 7 current 2
recieve request 10 current 3
recieve request 9 current 4
recieve request 8 current 5
recieve request 11 current 6
recieve request 14 current 7
recieve request 13 current 8
recieve request 12 current 9
recieve request 15 current 10
recieve request 16 current 11
recieve request 18 current 12
recieve request 17 current 13
recieve request 19 current 14
recieve request 0 current 15
recieve request 1 current 16
recieve request 3 current 17
recieve request 2 current 18
recieve request 4 current 19
*/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询