Zookeeper分布式锁解决方案

一、非分布式下,单项目--单进程下获取订单号模拟

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();

                          }

                  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值