一、前言 分布式锁一般有3中实现方式: 1、数据库乐观锁; 2、基于Redis的分布式锁; 3、基于zookeeper的分布式锁 二、可靠性 为了确保分布式锁的可用,我们至少要确保锁的实现满足以下4个条件 1、互斥性。在任意时刻,只有一个客户端持有锁; 2、不会发生死锁。即使有一个客户端在持有锁的期 ...
分类:
其他好文 时间:
2020-04-04 09:46:07
阅读次数:
430
一、全称 AbstractQueueSynchronier 二、并发包的使用 ReentrantLock:new ReentrantLock()/lock()/unlock() ReentranReadWriteLock 可重入锁:对同一个对象可以多次加锁 三、底层 1.抽象同步队列三个核心组件:加 ...
分类:
其他好文 时间:
2020-04-02 12:02:12
阅读次数:
78
锁 根据加锁的范围,MySQL ??的锁?致可以分成全局锁、表级锁和?锁三类 全局锁 全局锁就是对整个数据库实例加锁。MySQL 提供了?个加全局读锁的?法,命令是Flush tables with read lock (FTWRL)。让整个库处于只读状态。全局锁的典型使?场景是,做全库逻辑备份。也 ...
分类:
数据库 时间:
2020-04-01 11:06:55
阅读次数:
81
容器架构 Hashtable HashMap SynchronizedHashMap CurrentHashMap CurrentSkipListMap(弥补同步的TreeMap) Hashtable所以方法默认加sychronized, HashMap默认没有加锁, 而SynchronizedHa ...
分类:
编程语言 时间:
2020-03-31 20:55:14
阅读次数:
83
应用场景 业务概念上只适合在系统中保留一份的数据,比如系统的配置信息类适合设计为单例模式,还可以使用单例模式解决多个实例访问资源冲突的问题。 实现 饿汉式 懒汉式 双重检测 内部静态类 实现对比 1. 饿汉式,在类加载期间就已经将instance静态类初始化好,所以instance实例的创建时线程安 ...
分类:
其他好文 时间:
2020-03-31 19:04:03
阅读次数:
56
悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。如果加锁的时间过长,其他用户长时间无法访问,影响了程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是对长事务而言,这样的开销往往无法承受。所以与悲观锁相对的,我们有 ...
分类:
数据库 时间:
2020-03-31 12:07:49
阅读次数:
74
库存的变化是原子性的,如果在更新的库存的时候没有考虑好如何更新库存,那么会导致库存的 重复修改、脏读、幻读、不可重复读等操作。 但如果加锁的粒度过于大的话,就会导致大量的更新库存的请求失败。无法支持高并发的。 那么该怎么样写合适代码来更新库存呢? 其实核心思想是: 1. 加事务 2. 查询更新 先看 ...
分类:
其他好文 时间:
2020-03-31 01:34:26
阅读次数:
239
锁的分类 读锁和写锁,表锁和行锁 表锁 偏向MyISAM存储引擎,开销小,加锁快,无死锁。发生锁冲突的概率最高,并发度最低。 读锁 会话1对表1加了读锁后,可以查询表1,不能更新表1,也不能查询别的表。与此同时会话2可以查询表1,更新表1会阻塞,等待读锁的释放。 写锁 会话1对表1加了写锁后,可以查 ...
分类:
数据库 时间:
2020-03-29 17:58:44
阅读次数:
95
先聊下redis普通的分布式锁,用 1.单节点、主从/哨兵模式的分布式锁,安全吗? 或许你了解过,通过如下方式加锁: 设置锁时,使用set命令,因为其包含了setnx,expire的功能,起到了原子操作的效果,给key设置随机值,并且只有在key不存在时才设置成功返回True,并且设置key的过期时 ...
分类:
其他好文 时间:
2020-03-29 17:46:22
阅读次数:
79
!!!我的数据库演示版本为5.5,以后会追加最新数据库的演示版本 间隙锁(GAP Lock)时InnoDB在可重复读下的隔离级别下为了解决幻读问题引入的锁机制。幻读存在的问题是因为在新增或者更新时如果进行查询,会出现不一致的现象,这时单纯的使用行锁无法满足我们的需求,我们需要对一定范围的数据加锁,防 ...
分类:
其他好文 时间:
2020-03-28 19:54:04
阅读次数:
553