一、非分布式下,单项目--单进程下获取订单号模拟
OrderNumGenereator.java
package com.xiangshuai.fbss.order;
import java.text.SimpleDateFormat;
import java.util.Date;
public class OrderNumGenereator {
public static int num=0;
public String getOrderNum(){
//指定格式化格式
SimpleDateFormat f=new SimpleDateFormat("今天是 "+"yyyy-MM-dd-HH-mm-ss");
String orderNum=f.format(new Date())+"-"+ ++num;
//System.out.println(orderNum);
return orderNum;
}
public static void main(String[] args) {
new OrderNumGenereator().getOrderNum();
}
}
LockMl.jav a
package com.xiangshuai.fbss.order;
public class LockMl implements Runnable{
private OrderNumGenereator orderNumGenereator=new OrderNumGenereator();
public String getOrderNum(){
synchronized(LockMl.class){ //单进程下锁有效,分布式下无效,需用zookeeper设置临时节点进行锁控制
String orderNum = orderNumGenereator.getOrderNum();
System.out.println(orderNum);
return orderNum;
}
}
public void run() {
getOrderNum();
}
public static void main(String[] args) {
for(int i=0;i<100;i++){
new Thread(new LockMl()).start();
}
}
二.分布式下,由于synchronized只对单进程有效,因此需要在zookeeper下
创建临时节点-锁来替代synchronized(因为zookeeper节点的唯一性)
package com.xiangshuai.fbss.Service;
import com.xiangshuai.fbss.Lock;
import com.xiangshuai.fbss.ZookeeperDistrbuteLock;
import com.xiangshuai.fbss.order.LockMl;
import com.xiangshuai.fbss.order.OrderNumGenereator;
/**
* @author lqx
* 分布式锁使用zk,在zk上创建一个临时节点(有效期) ,使用临时节点作为锁,因为节点不允许重复。
如果能创建节点成功,生成订单号,如果创建节点失败,等待。临时节点zk关闭,释放锁,其他节点就可以重新生成订单号。
代码在:
*
*/
public class OrderServiceImpl implements Runnable {
private OrderNumGenereator orderNumGenerator = new OrderNumGenereator();
Lock lock=new ZookeeperDistrbuteLock();
public void getOrderNum(){
/*
获取锁 -- @author lqx,分布式锁代码在 E:\学习文档子目录压缩\框架\微服务相关\Zookeeper\蚂蚁1期\Zookeeper分布式锁解决方案\com.xiangshuai.fbss--分布式锁代码
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\微服务相关\Zookeeper\蚂蚁1期\Zookeeper分布式锁解决方案\com.xiangshuai.fbss--分布式锁代码
**/
lock.getLock();
String orderNum = orderNumGenerator.getOrderNum();
System.out.println(orderNum);
lock.unLock();//关闭zookepper链接,删除zoo临时节点
}
public void run() {
getOrderNum();
}
//模拟分布式并发获取订单号操作
public static void main(String[] args) {
for(int i=0;i<100;i++){
new Thread(new OrderServiceImpl()).start();
}
}
}