对象锁和块锁

news/2024/5/17 17:47:19 标签: synchronized, 多线程, 并发

        昨天测试同事测出一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


http://www.niftyadmin.cn/n/1316511.html

相关文章

简单说说java的事件模型

事件模型 首先你得有个事主儿(事件源),啥时候做个事通知我下,我好处理,OK,在我这注个册吧,有事告你声,你好处理,事情来了,调用准备好的方法XX。。。 事件源 ---发生事件的对象 事件…

Spring源码分析-AOP动态代理

Spring源码分析系列 Spring源码分析-启动流程浅析 Spring源码分析-BeanDefinition Spring源码分析-Bean管理查找与注册(1) Spring源码分析-Bean管理查找与注册(2) Spring源码分析-Bean管理循环依赖和三级缓存 Spring源码分析-Bean生命周期概述 Spring源码分析-Bean生命周期cre…

JAVA读写文件小实例

测试同事在测试时,需要测试一些比较特殊的场景,需要往第三方的文件中新增数据,而第三方文件内容是以特殊的\u0001做为分隔符的,用普通的文本编辑工具打开是乱码。因此,特写了一个文件操作的小程序给测试同事。 小程序功…

[leetcode] Remove Element

思路:数组元素删除操作较麻烦,这里采用的是交换元素法,利用两个指针分别指数组的开头下标和尾部下标,把要删除的元素放在数组的最后,最后返回前面指针的下标。 Java代码: public int removeElement(int[] n…

2个2D向量计算交点的夹角和补角

2维向量如何计算与某一个交点之间的夹角,假设A,B是向量,C是他们共同连接的一个点计算出A-C-B形成的角度 我们先了解几个简单的计算: 2D向量的乘积计算(A.x * B.x A.y * B.y) 2D向量的取摸开平方(A.x * A.x A.y * A.y) 弧度转换角度弧度 除以 圆周率 再乘以180 角度转换弧度角…

JAVA中使用jks做为证书管理

文章目录前言一、转换二、ssl/tls会话流程总结前言 如果想开启ssl/tls服务,必须要要有证书才可以,然而java使用的证书格式默认是jks(java key store),所以通常需要将证书格式进行转化。不知道为什么不能直接使用openssl生成的格式 一、转换 …

Cookie入门及应用实例

最近在工作中,牛逼的前端为追求更好的体验,如对于无需与后台请求交互(纯前端的页面跳转、页面内容的展示),但Session已过期,用户操作后提交,后台再提示已过期,给用户的体验不好,于是想到了Cooki…

Grafana or Prometheus基本配置

本文主要基于prometheus作为数据源,对grafana进行相关配置 1、Display Name 默认将所有标签都显示出来,不容易分辨,可以通过Display Name进行设置,选择某一个标签 文档:Configure standard options | Grafana docum…