案例 黄牌发行流水号,同步与锁
项目需求,需要一个唯一id且格式为yyyyMM + '四位流水号'的黄牌发行号
方式一、同步方法
package com.string; import java.text.SimpleDateFormat; import java.util.Date; //import com.jc.jdc.yellowcard.service.YellowCardService; /** * 发行流水号,格式yyyyMMdd + '四位流水号'
* @time 2019-09-10 19:02 * @author wang-xiaoming * */ public class IssueNumberUtil_Syn { /** * 初始化发行号为null(0L) */ private static Long issueNumber = null; /** * 获取唯一发行号,这里可以把synchronized关键字去掉测试,会出现重复 * @return * @throws Exception */ public static synchronized long getIssueNumber() throws Exception{ if(issueNumber == null){ /*// 服务器启动获取bean,当服务器需要重启或宕机时,重新获取bean,从数据库读取最大发行号 YellowCardService yellowCardService = (YellowCardService) SpringBeanUtils.getBean("yellowCardService"); // 获取数据库中的最大发行号 // 为保险起见,yellowCardService.findMaxIssueNumber方法中也可以加把锁 issueNumber = yellowCardService.findMaxIssueNumber();*/ } issueNumber = (issueNumber == null || "".equals(issueNumber))? 201909090001L:issueNumber; SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); long issueNumber1 = Long.parseLong(formatter.format(new Date()) + "0001"); if(issueNumber1 > issueNumber){ issueNumber = issueNumber1; return issueNumber; }else{ return ++issueNumber; } } public static void main(String[] args) { // 多线程测试,模拟5000个线程同时调用getIssueNumber方法 for (int i=0 ; i < 5000; i++) { new Thread(new Runnable() { @Override public void run() { try { System.out.println(getIssueNumber()); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } }
方式二、同步对象锁
package com.string; import java.text.SimpleDateFormat; import java.util.Date; //import com.jc.jdc.yellowcard.service.YellowCardService; /** * 黄牌发行流水号,格式yyyyMMdd + '四位流水号' * @author wang-xiaoming * */ public class IssueNumberUtil_Lock { /** * 对象锁 */ private static final Object lock = new Object(); /** * 初始化发行号为null(0L) */ private static Long issueNumber = null; /** * 获取唯一发行号 * @return * @throws Exception */ public static long getIssueNumber() throws Exception{ synchronized (lock) { if(issueNumber == null){ /*// 服务器启动获取bean,当服务器需要重启或宕机时,重新获取bean,从数据库读取最大发行号 YellowCardService yellowCardService = (YellowCardService) SpringBeanUtils.getBean("yellowCardService"); // 获取数据库中的最大发行号 // 为保险起见,yellowCardService.findMaxIssueNumber方法中也可以加把锁 issueNumber = yellowCardService.findMaxIssueNumber();*/ } issueNumber = (issueNumber == null || "".equals(issueNumber))? 201909090001L:issueNumber; SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); long issueNumber1 = Long.parseLong(formatter.format(new Date()) + "0001"); if(issueNumber1 > issueNumber){ issueNumber = issueNumber1; return issueNumber; }else{ return ++issueNumber; } } } public static void main(String[] args) { // 多线程测试,模拟5000个线程同时调用getIssueNumber方法 for (int i=0 ; i < 5000; i++) { new Thread(new Runnable() { @Override public void run() { try { System.out.println(getIssueNumber()); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } }
源码分享
链接:https://pan.baidu.com/s/1EIBs7mitJTH-hsFXPfAFfg 提取码:pqoc
雨淋淋过的季节