当前位置: 首页 > news >正文

curator教程二——分布式锁

简介

  在分布式环境下,为了防止多个服务同时修改同一个值,出现数据同步问题,通常用redis和zookeeper做分布式锁,在这里我们用zookeeper做分布式锁,并和单点环境中ReenTranLock锁相比较

1、ReenTranLock

 

package bjsxt.curator.lock;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock;

public class Lock1 {

    static ReentrantLock reentrantLock = new ReentrantLock();
    static int count = 10;
    public static void genarNo(){
        try {
            reentrantLock.lock();
            count--;
            System.out.println(count);
        } finally {
            reentrantLock.unlock();
        }
    }
    
    public static void main(String[] args) throws Exception{
        
        final CountDownLatch countdown = new CountDownLatch(1);
        for(int i = 0; i < 10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        countdown.await();
                        genarNo();
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                    }
                }
            },"t" + i).start();
        }
        Thread.sleep(50);
        countdown.countDown();

        
    }
}

 

  • 结果
9
8
7
6
5
4
3
2
1
0
  • 说明
  • 本类开启了十个线程,来操作count值,从结果可以看出是线程安全的

2、zookeeper分布锁InterProcessMutex

 
 
package bjsxt.curator.lock;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;


public class Lock2 {

    /** zookeeper地址 */
    static final String CONNECT_ADDR = "192.168.0.4:2181,192.168.0.9:2181,192.168.0.6:2181";
    /** session超时时间 */
    static final int SESSION_OUTTIME = 5000;
    
    static int count = 10;
    public static void genarNo(){
        try {
            count--;
            System.out.println(count);
        } finally {
        
        }
    }
    
    public static void main(String[] args) throws Exception {
        
        //1 重试策略:初试时间为1s 重试10次
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);
        //2 通过工厂创建连接
        CuratorFramework cf = CuratorFrameworkFactory.builder()
                    .connectString(CONNECT_ADDR)
                    .sessionTimeoutMs(SESSION_OUTTIME)
                    .retryPolicy(retryPolicy)
//                    .namespace("super")
                    .build();
        //3 开启连接
        cf.start();
        
        //4 分布式锁
        final InterProcessMutex lock = new InterProcessMutex(cf, "/super");
        final CountDownLatch countdown = new CountDownLatch(1);
        
        for(int i = 0; i < 10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        countdown.await();
                        //加锁
                        lock.acquire();
                        //-------------业务处理开始
                        genarNo();
                        //-------------业务处理结束
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            //释放
                            lock.release();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            },"t" + i).start();
        }
        Thread.sleep(100);
        countdown.countDown();
    }
}
  • 结果
  • 9
    8
    7
    6
    5
    4
    3
    2
    1
    0

    说明:

  • 本类用InterProcessMutex做分布式锁,通过zookeeper节点不能重复的原理来让分布式环境的服务排队处理同一个数据

转载于:https://www.cnblogs.com/520playboy/p/6441651.html

相关文章:

  • 理解WEB API网关
  • [APUE]进程关系(下)
  • 已看电影|连续剧_已迁移
  • 循序渐进Python3(十三) --6--  cookie和session
  • sed和awk的使用
  • Linux运维笔记-云服务器数据盘挂载
  • 大端模式与小端模式、网络字节顺序与主机字节顺序
  • Azure实践系列 2:Azure AD中的用户管理
  • 数据类型和逻辑运算符的一点整理
  • java Stack类 Vector类
  • 事件绑定的几种常见方式
  • Connection Quality Indicator-Citrix VDA连接质量诊断工具
  • spark 02 操作算子
  • 轻松使用二进制安装Mysql5.6
  • rman RMAN-06059: expected archived log not found
  • 【RocksDB】TransactionDB源码分析
  • angular2开源库收集
  • Git学习与使用心得(1)—— 初始化
  • jdbc就是这么简单
  • js写一个简单的选项卡
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python学习笔记 字符串拼接
  • win10下安装mysql5.7
  • 前端工程化(Gulp、Webpack)-webpack
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • ionic异常记录
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​【已解决】npm install​卡主不动的情况
  • ​configparser --- 配置文件解析器​
  • ​水经微图Web1.5.0版即将上线
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #define、const、typedef的差别
  • #数学建模# 线性规划问题的Matlab求解
  • $L^p$ 调和函数恒为零
  • (算法)N皇后问题
  • (转)fock函数详解
  • (转)Google的Objective-C编码规范
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 回调、接口回调、 委托
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net6使用Sejil可视化日志
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • [145] 二叉树的后序遍历 js
  • [383] 赎金信 js
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [C# 网络编程系列]专题六:UDP编程
  • [C++]AVL树怎么转
  • [Gamma]阶段测试报告
  • [GN] 设计模式——面向对象设计原则概述
  • [HNOI2015]实验比较
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [java/jdbc]插入数据时获取自增长主键的值
  • [JavaEE]线程的状态与安全
  • [LaTex]arXiv投稿攻略——jpg/png转pdf
  • [LeetCode] Max Points on a Line