我几次遇到这种情况.你需要的是一个单独的LockFactory,它实际上是一个锁对象弱引用的字典.代码应该是这样的:

class LockFactory {

private LockFactory() {}

private LockFactory instance = null;

public static LockFactory getInstance() {

if (this.instance == null)

this.instance = new LockFactory();

return this.instance;

}

private int _last_check_size = 0;

private int _cleanup_size = 1000;

private Map weakRefDictionary = new HashMap();

public object getLock(String id) {

synchronized(this) {

if (!this.weakRefDictionary.containsKey(id))

this.weakRefDictionary.put(id, new WeakReference(null));

Object lock = this.weakRefDictionary.get(id).Target;

if (lock == null) {

lock = new Object();

this.weakRefDictionary.get(id).Target = lock;

}

if (this.weakRefDictionary.size() > this._last_check_size + this._cleanup_size)

this._do_cleanup();

return lock;

}

}

public void _do_cleanup() {

synchronized(this) {

Iterator> iter = this.weakRefDictionary.entrySet().iterator();

while (iter.hasNext()) {

Map.Entry entry = iter.next();

if (entry.getValue().get() == null) {

iter.remove();

}

}

this._last_check_size = this.weakRefDictionary.size();

}

}

}

现在在你的情况下使用只需:

public void beforeUpdated(Log log){

synchronized(LockFactory.getInstance().getLock(log.getUuid())){

query(log);

merge(log);

persist(log);

}

}

java添加锁_java – 如何在这种情况下添加锁?相关推荐

  1. java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

    前言 为什么需要去了解AQS,AQS,AbstractQueuedSynchronizer,即队列同步器.它是构建锁或者其他同步组件的基础框架(如ReentrantLock.ReentrantRead ...

  2. java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  3. java 静态方法枷锁_Java synchronized静态方法使用synchronized加锁

    昆明达内Java培训的老师上一期讲了Java synchronized实例方法使用synchronized加锁,这一期给同学们讲Java synchronized静态方法使用synchronized加 ...

  4. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  5. mysql 事务 查询 范围加锁_MySQL死锁系列-常见加锁场景分析

    本文我们就从原理走向实战,分析常见 SQL 语句的加锁场景.了解了这几种场景,相信小伙伴们也能举一反三,灵活地分析真实开发过程中遇到的加锁问题. 如下图所示,数据库的隔离等级,SQL 语句和当前数据库 ...

  6. java 锁竞争_Java多线程中的竞争条件、锁以及同步的概念

    竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生"竞争条件"的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作 ...

  7. java 锁升级_Java并发 锁优化和锁升级

    前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...

  8. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  9. C/C++ 线程三种并发方式比较(传统互斥量加锁方式, no lock不加锁的方式, 原子函数方式)

    执行速度结果: 传统互斥量加锁方式 < no lock不加锁的方式 < 原子函数方式 正文如下: 最近编码需要实现多线程环境下的计数器操作,统计相关事件的次数.下面是一些学习心得和体会.不 ...

最新文章

  1. html工具类,一些小工具
  2. 分页存储过程性能比较 二分法
  3. clion 查看内容窗口_了解Photoshop文档窗口(3)
  4. 时间源服务器|授时仪|GPS时钟同步系统
  5. Eclipse 安装插件(aptana、svn 、git、Java EE、JSHint)
  6. java ajax html复选框,HTMLjavaSkcriptCSSjQueryajax(九)(示例代码)
  7. Java原子操作类AtomicInteger应用场景
  8. 远程连接“终端服务器超出了最大允许连接数” 解决
  9. Django1.6 运行manage.py 报错解决办法(ImportError)
  10. linux快捷删除151617文件,mengzhaoliang
  11. 06LaTeX学习系列之---TeXstudio的使用
  12. Shell下syntax error: operand expected (error token is “-”)
  13. SocketTool.exe 端口占用
  14. DSP之CCS软件使用一
  15. java超市库存管理系统_java实现超市库存管理系统
  16. Windows 搭建网络代理服务器
  17. 新路由3 newifi3 官方固件与离线插件合集
  18. Android后端工程师的要求,后端工程师的岗位职责和能力
  19. 声纹识别(一)——简介
  20. vue 关于父组件同时多次调用子组件而产生的 this取值 的bug问题

热门文章

  1. JDK源码(9)-Double、Float
  2. oracle菜鸟学习之 复杂的更新语句使用
  3. 分布式系统监视zabbix讲解十之监控tomcat--技术流ken
  4. SSRS 2012 仪表 -- 范围
  5. 用C语言设计光线成像程序——计算机达人成长之路(26)
  6. 一个简单的mysql服务检测启动脚本
  7. JavaScript Unicode字符操作
  8. PHP自学--第一天
  9. 避免下载Word/Excel文件时被IE开启
  10. 更换高端游戏计算机故障电源,加内存条后电脑重启的解决办法游戏设备故障解决分享!...