博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
curator教程二——分布式锁
阅读量:6237 次
发布时间:2019-06-22

本文共 3740 字,大约阅读时间需要 12 分钟。

简介

  在分布式环境下,为了防止多个服务同时修改同一个值,出现数据同步问题,通常用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();            }}

 

  • 结果
9876543210
  • 说明
  • 本类开启了十个线程,来操作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();    }}
  • 结果
  • 9876543210

    说明:

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

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

你可能感兴趣的文章
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
高仿Instagram 页面效果android特效
查看>>
2016 年总结
查看>>
将String转化成Stream,将Stream转换成String
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
查看>>
JavaScript 数据类型
查看>>
量子通信和大数据最有市场突破前景
查看>>
如何申请开通微信多客服功能
查看>>
Sr_C++_Engineer_(LBS_Engine@Global Map Dept.)
查看>>
非监督学习算法:异常检测
查看>>
jquery的checkbox,radio,select等方法总结
查看>>
Linux coredump
查看>>
Ubuntu 10.04安装水晶(Mercury)无线网卡驱动
查看>>