使用ReentrantLock的一点小问题

问题产生:

最近使用 ReentrantLock 在批处理代码中的时候,发现应该更新的1000+条数据中,只有2条成功更新了,百思不得其解,后来查询日志得知报了一个错 IllegalMonitorStateException ,问了度娘,解释为当前的线程不是此对象监视器的所有者。也就是要在当前线程锁定对象,才能用锁定的对象此行这些方法,像notify(),notifyAll()方法了,导致某一个线程调用了了另一个线程的这个方法;当时我就晕了,这个不是当使用 synchronized 的时候才有的方法吗???

问题解决:

于是乎仔细打断点排查代码问题,发现了一个致命的错误,就是在使用 ReentrantLock 时,我的代码块如下

 
private final ReentrantLock lock = new ReentrantLock();

public void batchSaveOrUpdate( List<OrganBusinessDetail> list){
        OrganDetailSearchDAO organDetailSearchDAO = DAOFactory.getDAO(OrganDetailSearchDAO.class);
        lock.lock();
        for (OrganBusinessDetail organBusinessDetail : list) {
                try {
                  中间省略;
                   }catch (Exception e){
                     e.printStackTrace();
                     }finally { lock.unlock(); }

 

                                        

      想必看到这里错误已经很明显了,在lock.lock();执行后,当前线程锁定,执行完第一次循环后,lock.unlock();解除锁定,然后第二次执行循环时,由于lock.lock();不在循环体内,此时并木有锁定。。。所以导致最后lock.unlock()直接报错了。

仅此记录自己愚蠢的一次问题

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值