对象锁和块锁

        昨天测试同事测出一BUG,经分析是并发的问题,于是速速的加synchronized(this)提交,如下所示:


        可测试发现,我的synchronized根本不起作用。经分析,这里没有生效的原因是:每次请求过来,我都往线程池中submit一个匿名的实例(即new Runnable(){...}每次都是新建实例),而synchronized(this)锁住的是对象,所以不起作用。

        于是,修改如下,即控制住了,synchronized(locks)锁住空字节数组静态对象,各线程之间锁的都是这个locks。


        当然,对于我们的项目,由于是多应用节点部署的,通过synchronized锁是控制不住的,最终还是需采用数据库表进行并发控制。

        思路:新建一张表,里面设置一个状态字段(如0表示没有线程执行,1表示有线程正在执行),在代码的开始的地方,先查询表的这个状态是否为0,如为0,则将状态改为1,这样其它线程进来查询就发现是1,则等待一段时间再查询,直到为0再执行;在功能代码结束的地方(最好是finally中),将状态修改为0。

        特别注意:在代码的开始的地方,先查询表的这个状态是否为0,如为0,则将状态改为1,这块的逻辑要放在事务中,且查询表的状态用for update,以防止其它线程查出不正常的状态。

对象锁、类锁详细分析见:http://bijian1013.iteye.com/blog/1836575

猜你喜欢

转载自bijian1013.iteye.com/blog/2354732