并发情况下synchronized死锁
来源:互联网 发布:那个淘宝网最好最便宜 编辑:程序博客网 时间:2024/06/07 02:27
存在缺陷的代码:
public class DataPropertyIdAndNameRepositoryImpl{ /** 发布标志 */ private volatile boolean publishFlag; public Integer getStandardId(int dataId, String propertyName) { if (!publishFlag) { loadToCache(); } Integer standardId = 0; Map<String, Integer> propertyIdMap = propertyIdLocalCache.get(dataId); if (propertyIdMap != null) { standardId = propertyIdMap.get(propertyName); } return standardId; } public synchronized boolean loadToCache() { try { DataPropertyIdAndName dataPropertyIdAndName = dataPropertyIdAndNameService .queryDataPropertyIdAndName(); publishFlag = true; } catch (Exception e) { publishFlag = false; } return publishFlag; }}
存在缺陷的流程:
a. 绿色表示第一个线程,蓝色表示第二个线程。
b. 黄色模块的代码为synchronized标记的代码,并发情况下只会有一个线程执行此方法。
c. 绿色线程执行到紫色模块时,蓝色线程等待进入黄色模块。
d. 蓝色线程执行抛异常,导致publishFlag被置为false。
e. 此时再次有线程进入,判断publishFlag仍为false,因此导致重复不断加载loadToCache.
修复后的代码:
public class DataPropertyIdAndNameRepositoryImpl{ /** 发布标志 */ private volatile boolean publishFlag; public Integer getStandardId(int dataId, String propertyName) { if (!publishFlag) { loadToCache(); } Integer standardId = 0; Map<String, Integer> propertyIdMap = propertyIdLocalCache.get(dataId); if (propertyIdMap != null) { standardId = propertyIdMap.get(propertyName); } return standardId; } public synchronized boolean loadToCache() { try { // 双检锁 if (publishFlag) { return publishFlag; } DataPropertyIdAndName dataPropertyIdAndName = dataPropertyIdAndNameService.queryDataPropertyIdAndName(); publishFlag = true; } catch (Exception e) { publishFlag = false; } return publishFlag; }}
- 并发情况下synchronized死锁
- 并发情况下ReentrantLock死锁
- sql server中高并发情况下 同时执行select和update语句死锁问题 (一)
- sql server中高并发情况下 同时执行select和update语句死锁问题 (二)
- sql server中高并发情况下 同时执行select和update语句死锁问题
- sql server中高并发情况下 同时执行select和update语句死锁问题
- sql server中高并发情况下 同时执行select和update语句死锁问题 (二)
- sql server中高并发情况下同时执行select和update语句死锁问题(一)
- sql server中高并发情况下同时执行select和update语句死锁问题(二)
- sqlserver高并发情况下 select 和update操作造成死锁的解决方法
- sqlserver高并发情况下 select 和update操作造成死锁的解决方法
- IE6特定情况下的死锁
- synchronized在多线程情况下的使用
- 死锁情况
- Java多线程,线程同步synchronized,线程死锁【线程池常规用法】多线程并发处理
- Synchronized: 递归与死锁
- synchronized产生的死锁
- 使用synchronized产生死锁
- NYOJ 题目1 A+B Problem
- java Object类中的toString方法
- CFGYM 2013-2014 CT S01E03 D题 费用流模版题
- python 探索(三) Python CookBook 文本处理 笔记
- 为何要面向对象——封装
- 并发情况下synchronized死锁
- hdu 4745 Two Rabbits
- NYOJ 题目13 Fibonacci数
- libjson 编译和使用 - 1. 编译
- Spring实现邮件发送
- mount挂载img文件(待更新)
- hdu 3631 Shortest Path
- 1到n中1的个数
- hdu 4717 The Moving Points