JAVA中的各种锁以及最优的zookeeper分布式锁解决方案

一、锁出现的原因-线程或者进程竞争资源

当有一个或者多个线程或者进程进行操作时,其他线程或者进程都不可以对这个资源进行操作,直到该线程或者进程完成操作,其他线程或者进程才能对该资源进行操作,而其他线程或进程都处于等待状态。

二、线程同步的方式和机制

1、解决资源竞争问题

(1)临界区:通过对多线程的串行化来来访问公共资源或者而一段代码

  • Synchronized修饰的java方法

(2)互斥量:采用互斥对象机制,只有拥有互斥对性的线程才能访问

  • Synchronized修饰的代码块
  • 分布式锁的只要实现机制
2、解决执行顺序

信号量:他允许对个任务在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

CountDownLatch,CyclicBarrier和semaphore


三、分布式锁实现的技术

1、基于数据库实现分时锁

(1)性能较差,容易出现单点故障

(2)锁没有失效时间,容易死锁

(3)非阻塞式

乐观锁

2、基于缓存实现分布式锁

(1)所没有失效时间

(2)非阻塞式

3、基于Zookeeper实现分布式锁

(1)实现比较简单

(2)可靠性高

(3)性能较好

四、ZooKeeper简介

ZooKeeper是一个分布式,开放源码的分布式应用程序协调服务,是Hadoop和HBASE的重要组件,在zookeeper中,znode是一个跟Unix或者Windows文件系统路径相似的节点,可以往这个节点存储或者获取数据

特点:

1、在zookeeper中,znode是一个跟unix或windows文件系统相似的节点,可以往这个节点存储或者获取数据

2、通过客户端可以对znode进行增删改查操作,还可以注册watcher监控znode的变化

3、znode跟文件系统一样,名称不可以重复(同一个znode下,节点名称唯一)

zookeeper节点类型:

持久节点(persistent)

持久顺序节点(persistent_sequential)

临时节点(ephemeral)

临时顺序节点(ephemeral_sequential)

zookeeper典型应用场景:

1、数据发布订阅

2、负载均衡

3、命名服务

4、分布式协调

5、集群管理

6、配置管理

7、分布式队列

8、分布式锁

场景描述:再在线程高并发下,生产一定业务含义的唯一订单编号,如:2018-04-16-16-31-50-01,年月日时分秒序号,目的就是保证高并发状态下每一个用户创建的订单唯一



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值