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只能单线程访问的效果能实现吗?如果不能实现,应该如何修改呢?
展开
 我来答
不出腹肌不改网名2M
2015-04-14 · 超过40用户采纳过TA的回答
知道小有建树答主
回答量:79
采纳率:0%
帮助的人:74.2万
展开全部

为什么不用

synchronized(ObjClass.class)

直接锁在类上呢?

而且这个你可以用AtomicInteger做 更加方便,就是自增嘛

更多追问追答
追问
实现办法很多,之所以这样写,是想搞清楚是否所有会话共用了我创建的对象锁,也就是说,那个objecclass在服务器启动后,只存在一个,还是每个会话里面都存在一个?
追答
static变量 只有一个!
dksnear
2015-04-14 · TA获得超过1211个赞
知道小有建树答主
回答量:399
采纳率:0%
帮助的人:624万
展开全部
//模拟服务器
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

*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式