项目需求,需要一个唯一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() {@Overridepublic 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() {@Overridepublic void run() {try {System.out.println(getIssueNumber());} catch (Exception e) {e.printStackTrace();}}}).start();}}}

源码分享

链接:https://pan.baidu.com/s/1ERRTTCcews4TlIM_2PzSFw
提取码:bakn 

转载于:https://www.cnblogs.com/huakaiyoushi/p/11502320.html

黄牌发行流水号,同步与锁相关推荐

  1. synchronized同步对象锁

    package com.system.util;import com.common.Constants; import com.util.Cache;/*** 创建同步对象锁* * @author j ...

  2. Java核心(三)并发中的线程同步与锁

    2019独角兽企业重金招聘Python工程师标准>>> 乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了 ...

  3. Java多线程-线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package ...

  4. java学习(162):同步对象锁

    定义一个dog类 public class Dog {private String name;public String getName() {return name;}public void set ...

  5. Java 多线程和并发编程:(二)线程同步 Lock 锁

    线程同步 Lock 锁 1.Lock 锁 2.步骤 3.Lock 与 synchronized 的区别 1.Lock 锁 Lock 锁:对需要上锁的地方上锁 JDK1.5 后新增的功能 与 Synch ...

  6. 线程互斥和同步-- 互斥锁

    一. 线程分离 我们一般创建的线程是可结合的,这个时候如果我们调用pthread_jion()去等待的话,这种等待的方式是阻塞式等待,如果主线程一直等待,主线程就无法做其他的事情了,所以应该使用线程分 ...

  7. ReentrantLock+线程池+同步+线程锁

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  8. 线程同步----递归锁

    概述 最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等.在Windows系统中,临界区(Critical Se ...

  9. Java线程:线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public  ...

最新文章

  1. 招行java开发面试,面经:Java后台开发-招行网络科技
  2. 损失函数的可视化:浅论模型的参数空间与正则
  3. mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数
  4. 关于SAP Commerce Cloud CORS policy的设置问题
  5. spark stage 划分 源码
  6. xmrig 捐赠修改_四名学生如何通过CommuniGift更改在线捐赠
  7. Windows : Win 7 FT服务器 配置
  8. postgres 命令行建数据库表_PostgreSQL学习笔记(1)之模板数据库
  9. 如何使用 stack?- 每天5分钟玩转 Docker 容器技术(112)
  10. win10 android驱动安装失败,win10系统下小米手机驱动安装失败如何解决
  11. Wps文档目录页码加小括号?
  12. 如何快速开发一款APP
  13. 二值化网络的发展——从原始BNN到MeliusNet
  14. 酷派D530刷机指引
  15. 手算梯度下降法,详解神经网络迭代训练过程
  16. ElasticaSearch安装以及配置
  17. HDU 2187汶川地震
  18. 芒果PPT助手在POWERPOINT中的使用
  19. 12.bacnet mst/tp 报文 解析
  20. 动物模型/ 心血管疾病模型 / 啮齿动物高血压模型-自发性高血压大鼠(SHR)

热门文章

  1. ContentProvider 属性介绍
  2. Lesson 16 A polite request 彬彬有礼的要求
  3. MBP2019虚拟机解决方案
  4. 涨1100w播放,150w粉!B站UP主仅入站百天竟成功出圈!
  5. (C++语法篇)1.2 判断语句(if ……else……)
  6. 自动化行业工控系统Demo
  7. linux中的tar命令详解,【Linux】tar命令详解
  8. [ERROR]:用户“U1”创建失败
  9. Nuke python脚本开发 01
  10. 所有的错误都是精心包装的礼物