黄牌发行流水号,同步与锁
项目需求,需要一个唯一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
黄牌发行流水号,同步与锁相关推荐
- synchronized同步对象锁
package com.system.util;import com.common.Constants; import com.util.Cache;/*** 创建同步对象锁* * @author j ...
- Java核心(三)并发中的线程同步与锁
2019独角兽企业重金招聘Python工程师标准>>> 乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了 ...
- Java多线程-线程的同步与锁
一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package ...
- java学习(162):同步对象锁
定义一个dog类 public class Dog {private String name;public String getName() {return name;}public void set ...
- Java 多线程和并发编程:(二)线程同步 Lock 锁
线程同步 Lock 锁 1.Lock 锁 2.步骤 3.Lock 与 synchronized 的区别 1.Lock 锁 Lock 锁:对需要上锁的地方上锁 JDK1.5 后新增的功能 与 Synch ...
- 线程互斥和同步-- 互斥锁
一. 线程分离 我们一般创建的线程是可结合的,这个时候如果我们调用pthread_jion()去等待的话,这种等待的方式是阻塞式等待,如果主线程一直等待,主线程就无法做其他的事情了,所以应该使用线程分 ...
- ReentrantLock+线程池+同步+线程锁
1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...
- 线程同步----递归锁
概述 最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等.在Windows系统中,临界区(Critical Se ...
- Java线程:线程的同步与锁
一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public ...
最新文章
- 招行java开发面试,面经:Java后台开发-招行网络科技
- 损失函数的可视化:浅论模型的参数空间与正则
- mbstowcs 和 wcstombs函数:C语言提供的宽字符和多字节字符转换函数
- 关于SAP Commerce Cloud CORS policy的设置问题
- spark stage 划分 源码
- xmrig 捐赠修改_四名学生如何通过CommuniGift更改在线捐赠
- Windows : Win 7 FT服务器 配置
- postgres 命令行建数据库表_PostgreSQL学习笔记(1)之模板数据库
- 如何使用 stack?- 每天5分钟玩转 Docker 容器技术(112)
- win10 android驱动安装失败,win10系统下小米手机驱动安装失败如何解决
- Wps文档目录页码加小括号?
- 如何快速开发一款APP
- 二值化网络的发展——从原始BNN到MeliusNet
- 酷派D530刷机指引
- 手算梯度下降法,详解神经网络迭代训练过程
- ElasticaSearch安装以及配置
- HDU 2187汶川地震
- 芒果PPT助手在POWERPOINT中的使用
- 12.bacnet mst/tp 报文 解析
- 动物模型/ 心血管疾病模型 / 啮齿动物高血压模型-自发性高血压大鼠(SHR)