synchronized 线程锁的实战使用-同步代码块方式

场景:

        公司项目需要做一个央行复杂报表的导出功能,需要渲染的源数据是通过存储过程获取,每次导出都需要将导出记录落地到服务器备份,标记导出的批次,在落地是批次号需要保证唯一不重复,所以用户使用导出功能的时候不能多人同时进行,也不能在一个导出功能在执行期间,同一个人再次点击导出功能,否则会出现批次号重复错误,为了保证同一时间内,只能有一个人执行导出功能,使用到synchronized代码块锁技术。(ps:项目为某保险公司运营管理系统,导出报表功能只有指定权限人员使用,如特定管理层人员,所以不会出现多人等待的不友好体验。)

项目局部代码图:

synchronized 线程锁的实战使用-同步代码块方式_第1张图片

 

解释:

        如下代码是在ServiceImpl中控制的的锁,首先在实现类ServiceImpl中定义一个static 的线程安全的ConcurrentHashMap用来存放锁标记,然后如下进行代码块控制:

//记录正在执行对比查询的表
private static ConcurrentHashMap currentExportReport = new ConcurrentHashMap();

boolean isExporting = false;
synchronized("currentExportReport"){
if(currentExportReport.get("Exporting") == null){
         currentExportReport.put("Exporting","Exporting");
 }else{
         isExporting = true;
        }
 }

if (isExporting) {
         logger.info("同一表正在导出,请稍后导出。。。");
         responseText = "{\"resCode\":\"1\",\"resMsg\":\"同一表正在导出,请稍后导出。。。\"}";
         return responseText;

}else {

        //执行逻辑代码区域

       currentExportReport.clear();//同步代码块执行完毕后,需要释放锁

}

 ConcurrentHashMap:

        ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap() 在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求。

        ConcurrentHashMap详细介绍可以借鉴博文http://www.importnew.com/22007.html,个人觉得写得很nice。

 

你可能感兴趣的:(线程安全)