一、锁出现的原因-线程或者进程竞争资源
当有一个或者多个线程或者进程进行操作时,其他线程或者进程都不可以对这个资源进行操作,直到该线程或者进程完成操作,其他线程或者进程才能对该资源进行操作,而其他线程或进程都处于等待状态。
二、线程同步的方式和机制
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,年月日时分秒序号,目的就是保证高并发状态下每一个用户创建的订单唯一