悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的
分类:
其他好文 时间:
2019-04-27 00:21:11
阅读次数:
186
ReetrantLock是独占锁,一次只允许一个线程访问修改共享资源。我们经常会遇到这样的情况,需要经常读取共享资源,少了修改共享资源,这个时候我们用ReentrantLock并发效果就并不是那么nice了。JUC提供了一种读写锁,为我们很好的解决这一种场景: ReadWriteLock支持 读-写 ...
分类:
其他好文 时间:
2019-01-29 00:30:17
阅读次数:
197
一个Next-key锁结合了行锁和gap锁。 InnoDB执行一个行级别锁在这样的一个途径,那就是它搜索或者扫描一个表索引时,它设置共享或者独占锁在它遭遇的索引记录上。于是,行级锁是真实的行记录锁。一个next-key锁在一个行记录上总是这个行记录前的间隙。这就是一个next-key是一个索引记录锁 ...
分类:
数据库 时间:
2019-01-14 15:01:39
阅读次数:
205
public class TrinityLock { //为3表示允许两个线程同时获得锁 private final Sync sync = new Sync(3); private static final class Sync extends AbstractQueuedSynchronizer ...
分类:
其他好文 时间:
2018-11-28 12:35:39
阅读次数:
207
1.乐观锁--乐观锁是一种思想,它只解决对共享资源更新时的一致性问题,不解决读取共享资源过程中,其他线程修改了共享资源导致读取的是旧的资源的问题 一般范式为: 这种实现存在如下问题1):ABA问题 假如是链表结构,1线程操作期间,其他线程修改了A.next,1线程比较后自然以为是预期值,判断true ...
分类:
其他好文 时间:
2018-11-28 11:58:04
阅读次数:
623
引言 上一篇文章中详细分析了基于AQS的ReentrantLock原理,ReentrantLock通过AQS中的state变量0和1之间的转换代表了独占锁。那么可以思考一下,当state变量大于1时代表了什么?J.U.C中是否有基于AQS的这种实现呢?如果有,那他们都是怎么实现的呢?这些疑问通过详细 ...
分类:
编程语言 时间:
2018-08-30 10:58:13
阅读次数:
180
一 .概述 在前面,我们说到了java提供了synchronized关键词帮助我们实现一个可重入的独占锁的概念. 本节,我们讨论这个关键词的使用. 二 .使用方式 synchronized关键词可以出现在三个地方 [1]静态方法上 [2]实例方法上 [3]同步代码块上 从本质上说,我们其实没有必要分 ...
分类:
其他好文 时间:
2018-08-21 21:47:43
阅读次数:
225
1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更 ...
分类:
其他好文 时间:
2018-07-20 00:15:48
阅读次数:
176
1. 从乐观锁和悲观锁谈起 乐观锁和悲观锁是两种不同的解决并发问题的策略。悲观锁策略假定任何一次并发都会发生冲突,所以总是采用最严格的方式来进行并发控制。java中的独占锁(synchronized和重入锁)就是典型悲观锁实现,它只允许线程互斥的访问临界区,也就是阻塞式的同步方式。而乐观锁策略假定大 ...
分类:
其他好文 时间:
2018-07-14 19:28:30
阅读次数:
311
一、并发访问控制 实现的并发访问的控制技术是基于锁; 锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁;InnoDB支持表级锁和行级锁; 锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读;写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作; 锁还分为隐式锁和显式锁, ...
分类:
系统相关 时间:
2018-06-15 21:49:40
阅读次数:
206