zookeeper分布式锁模拟12306买票

未加锁时容易出现重复买票情况

代码

java 复制代码
public class Ticket12306 implements Runnable{

    // 票数
    private int ticketNums = 10;

    @Override
    public void run() {
        while (true){
            if (ticketNums>0){
                System.out.println(Thread.currentThread() + "抢到了第" + ticketNums + "张票");
                ticketNums--;
            }
        }
    }
}
java 复制代码
public class Main {
    public static void main(String[] args) {
        Ticket12306 ticket = new Ticket12306();

        // 模拟多个线程抢票
        Thread thread1 = new Thread(ticket, "窗口1");
        Thread thread2 = new Thread(ticket, "窗口2");

        thread1.start();
        thread2.start();
    }
}

结果

加分布式锁后

java 复制代码
public class Ticket12306 implements Runnable{

    // 票数
    private int ticketNums = 10;

    public Ticket12306() {
        // 重试策略
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(3000, 10);
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("192.168.106.140:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy)
                .build();
        // 开启连接
        client.start();

        lock = new InterProcessMutex(client,"/lock");
    }

    private InterProcessMutex lock;

    @Override
    public void run() {
        while (true){
            try {
                // 获取锁
                lock.acquire(3, TimeUnit.SECONDS);
                if (ticketNums>0){
                    System.out.println(Thread.currentThread() + "抢到了第" + ticketNums + "张票");
                    ticketNums--;
                }
                // 解锁
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                try {
                    lock.release();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }

        }
    }
}


出现问题

期间还遇到了一个小插曲,这里顺便记录下。

在连接zookeeper时候出现下面这个错误,刚开始以为是服务端zookeeper出问题了,但是检查后发现没问题,在服务端可正常创建、修改节点信息。

解决方案:关闭服务器防火墙

powershell 复制代码
systemctl stop firewalld
相关推荐
小北方城市网3 小时前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf
林_学4 小时前
预言:到2028年,本地开发环境会成为历史遗迹吗
云原生
老百姓懂点AI7 小时前
[云原生] K8s Operator开发实战:智能体来了(西南总部)AI调度官的CRD设计与Controller实现
人工智能·云原生·kubernetes
小尘要自信9 小时前
高级网络爬虫实战:动态渲染、反爬对抗与分布式架构
分布式·爬虫·架构
huizhixue-IT11 小时前
收藏-Kubernetes怎么从私有仓库拉取镜像?(K8S系列)
云原生·容器·kubernetes
小程故事多_8012 小时前
深度解析Kafka重平衡,触发机制、执行流程与副本的核心关联
分布式·kafka
哪里不会点哪里.12 小时前
什么是微服务?
微服务·云原生·架构
2501_9481201513 小时前
基于HBase的分布式列式存储
数据库·分布式·hbase
小北方城市网13 小时前
MyBatis-Plus 生产级深度优化:从性能到安全的全维度方案
开发语言·redis·分布式·python·缓存·性能优化·mybatis
【赫兹威客】浩哥13 小时前
【赫兹威客】伪分布式Kafka测试教程
分布式·kafka