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

校园网站建设方案书深圳做网站公司哪家好

校园网站建设方案书,深圳做网站公司哪家好,去国外政府网站做轮胎认证,网站制作论文5000字在分布式系统中多个服务需要竞争同一个资源时就需要分布式锁,这里使用zookeeper的临时顺序节点来实现分布式锁。 在节点X下创建临时顺序节点,getChildren()获取节点X的所有子节点,判断当前节点是否是第一个子节点,如果是就获取锁…

在分布式系统中多个服务需要竞争同一个资源时就需要分布式锁,这里使用zookeeper的临时顺序节点来实现分布式锁。

在节点X下创建临时顺序节点,getChildren()获取节点X的所有子节点,判断当前节点是否是第一个子节点,如果是就获取锁成功了,如果不是,那么就监听当前节点的前一个节点删除watcher事件,在前一节点删除之前当前线程需要阻塞等待,前一节点删除在watcher事件处理通知当前线程获取锁成功。

实现一:

还是使用curator按照上面的逻辑先来自己实现一个简易版的

首先需要抽象出一个DistributeLock类,有两个操作获取锁和释放锁。剩下的就是存储一些加锁节点路径信息等。

锁类定义如下:

public class DistributeLock {private CuratorFramework client;private String ROOT_PATH = "/test_lock";//顺序节点的父节点private String lockpath;//当前创建顺序节点的路径(全路径)private String currPath;//线程等待latchprivate CountDownLatch latch = new CountDownLatch(1);public DistributeLock(CuratorFramework client,String lockpath){this.client = client;this.lockpath = lockpath;}public boolean lock(){try {//创建临时顺序节点currPath = client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(ROOT_PATH+"/"+lockpath);String lockId = currPath.substring(currPath.lastIndexOf("/")+1);List<String> children = client.getChildren().forPath(ROOT_PATH);Collections.sort(children);//当前节点是顺序节点中第一个,获锁成功if(currPath.endsWith(children.get(0))){System.out.println(Thread.currentThread().getName() +"get lock0");return true;}/*** 不是第一个,监听排在自己前面节点的删除事件*///获取当前顺序节点前一节点的索引int preIndex = Collections.binarySearch(children,lockId)-1;//前一节点是否存在Stat stat = client.checkExists().forPath(ROOT_PATH+"/"+children.get(preIndex));System.out.println(ROOT_PATH+"/"+children.get(preIndex));System.out.println(stat==null);if(stat != null){//设置节点监听CuratorCache cache = CuratorCache.build(client,ROOT_PATH+"/"+ children.get(preIndex));cache.listenable().addListener(new CuratorCacheListener() {@Overridepublic void event(Type type, ChildData childData, ChildData childData1) {if(Type.NODE_DELETED.equals(type))latch.countDown();}});cache.start();}else{return true;}//等到前节点删除事件发生latch.await();System.out.println(Thread.currentThread().getName() +"get lock3");} catch (Exception e) {e.printStackTrace();return false;}return false;}public void unlock(){try {//删除当前节点client.delete().forPath(currPath);System.out.println(Thread.currentThread().getName() +"release lock");client.close();} catch (Exception e) {e.printStackTrace();}}

这里使用了CountDownLatch来进行线程阻塞,只是用来实现逻辑,很多细节没有考虑。比如可重入异常控制等。

然后使用这个分布式锁来控制线程执行:

//定义一个竞争资源
private final static AtomicInteger stock = new AtomicInteger(10);
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {executor.submit(new Runnable() {@Overridepublic void run() {CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));client.start();DistributeLock lock = new DistributeLock(client,"stock");lock.lock();int value = stock.decrementAndGet();System.out.println("stock change to:"+value);try {Thread.sleep(new Random().nextInt(2000));} catch (InterruptedException e) {e.printStackTrace();}lock.unlock();}});
}
executor.shutdown();

定义一个竞争资源stock,多个线程对该资源进行操作,一次只允许一个线程进行操作。

实现二:

在curator的recipes包里同样提供了工具类InterProcessMutex用来获取互斥锁。

//初始化锁,需要client连接和锁路径参数
InterProcessMutex mutexLock = new InterProcessMutex(client,"/mutex_lock");
//获取锁 阻塞等待,有重构方法可以设置等待时间
mutexLock.acquire();
//do sth
//释放锁
mutexLock.release();

他这里的锁就是可重入锁。一个线程acquire要对应同等量的release。

http://www.15wanjia.com/news/47656.html

相关文章:

  • 服务器分配网络提高网站访问速度百度关键词查询
  • 不同类型的网站搜索引擎营销的简称是
  • 网站做微信支付宝支付东莞seo网络推广专
  • 网站开发负责人是什么职位搜索引擎地址
  • 手机网站建设免费空间最新新闻消息
  • 北京网站建设费用如何提高seo关键词排名
  • 赤峰北京网站建设seo工具包
  • 家装设计网站开发抖音推广方案
  • 移动网站 html5什么是精准营销
  • 引擎搜索seo排名赚靠谱吗
  • 学做网站要会哪些站长网站工具
  • wordpress 服务器搬家苏州网站seo优化
  • 怎样做网站推销产品百度指数关键词工具
  • 网站内容收费关键词优化推广公司哪家好
  • iis网站连接数微商软文
  • 网站建设系统改版广东省广州市佛山市
  • 做私服网站租给发布站现在网络推广方式
  • 什么是灰色网站湖南长沙最新疫情
  • 龙岩北京网站建设深圳营销推广公司
  • 网站建设主题与建设目标谷歌应用商店下载
  • 查网站开发者信息流广告有哪些投放平台
  • 企业网站的建立特点是什么市场调研公司排名
  • 工商局网上办事大厅深圳seo优化推广
  • 好用的网站系统全渠道营销管理平台
  • 江苏水利工程建设局网站打开百度网页
  • 宣威做网站建设的公司电商大数据查询平台
  • 跨境电商开发seo设置是什么
  • 宝安led行业网站建设给大家科普一下b站推广网站
  • 湘潭网站建设 多少费用磐石网络百度网站收录提交
  • 织梦dedecms女性时尚门户网站模板如何创建自己的个人网站