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,年月日时分秒序号,目的就是保证高并发状态下每一个用户创建的订单唯一



猜你喜欢

转载自blog.csdn.net/tangyin_007/article/details/79961201