分布式锁遇锁等待_分布式锁(Zookeeper实现)

toov5 | 作者

urlify.cn/iUNfyq | 来源

分布式锁

分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性。锁服务可以分为两类,一个是 保持独占,另一个是 控制时序。

1. 所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把 zk 上的一个 znode 看作是一把锁,通过 create znode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。

2. 控制时序,就是所有视图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只是这里 /distributelock 已经预先存在,客户端在它下面创建临时有序节点(这个可以通过节点的属性控制:CreateMode.EPHEMERALSEQUENTIAL 来指定)。Zk 的父节点(/distribute_lock)维持一份 sequence, 保证子节点创建的时序性,从而也形成了每个客户端的全局时序。

分布式锁 单纯的Lock锁或者synchronize只能解决单个jvm线程安全问题

分布式 Session 一致性问题

分布式全局id(也可以使用分布式锁)

分布式锁,产生的原因是 集群

在单台服务器上 如何生成订单号(保证唯一),方案 UUid+时间戳方式, redis方式

生成订单号, 秒杀抢购时候,

首先预测100w订单号,生成放在redis。客户端下单,直接redis去获取即可。因为redis单线程的,多个线程去获取时候,安全呀。

实际150w用户。当redis剩下50w订单号时候,继续生成补充之。

如果在集群情况,UUid+时间戳。不能保证唯一性!,原因:

如果单台:

uuid+时间戳,生成的代码逻辑:

package com.toov5.Lock;import java.text.SimpleDateFormat;import java.util.Date;//生成订单号 时间戳public class OrderNumGenerator {  //区分不同的订单号    private static int count = 0;//单台服务器,多个线程 同事生成订单号    public String getNumber(){        try {            Thread.sleep(300);        } catch (Exception e) {            // TODO: handle exception        }        SimpleDateFormat simpt = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");        return simpt.format(new Date()) + "-" + ++count; //时间戳后面加了 count    }    }

开启100个线程调用之:

package com.toov5.Lock;public class OrderService implements  Runnable {           private OrderNumGenerator orderNumGenerator = new OrderNumGenerator(); //定义成全局的         public void run() {        getNumber();    }        public void getNumber(){    String number = orderNumGenerator.getNumber();    System.out.println(Thread.currentThread().getName()+"num"+number);    }        public static void main(String[] args) {        OrderS
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值