Java中使用到的锁】的更多相关文章

最初的代码 在最近的项目中,写出了这样的一段代码 private static SomeClass instance; public SomeClass getInstance() { if (null == instance) { instance = new SomeClass(); } return instance; } 然后在Code Review的时候被告知在多线程的情况下,这样写可能会导致instance有多个实例.比如下面这种情况: Time Thread A Thread B…
本篇主要内容如下: 本篇文章已收纳到我的Java在线文档. Github 我的SpringCloud实战项目持续更新中 帮你总结好的锁: 序号 锁名称 应用 1 乐观锁 CAS 2 悲观锁 synchronized.vector.hashtable 3 自旋锁 CAS 4 可重入锁 synchronized.Reentrantlock.Lock 5 读写锁 ReentrantReadWriteLock,CopyOnWriteArrayList.CopyOnWriteArraySet 6 公平锁…
本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结.本文不涉及ReentrantLock中的条件变量. 1.1.Lock接口 Lock接口,是对控制并发的工具的抽象.它比使用sy…
锁的本质 我们先来讨论锁的出现是为了解决什么问题,锁要保证的事情其实很好理解,同一件事(一个代码块)在同一时刻只能由一个人(线程)操作. 这里所说的锁为排他锁,暂不考虑读写锁的情况 我们在这里打个比方,假设有10个人要过独木桥(独木桥只能承载一个人的重量),他们可以排好队一个一个的过,后面一个人看到前面过去了之后他便跟着过去,直到所有的人都过去. 那如果我们用计算机模拟这个过程呢,没错,我们的程序不会排好队,更不会有看到前面的人已经通过这种主观能动性.所以这有点类似于所有的人都是蒙着眼睛的,但他…
java中很多地方会涉及到锁,比如java代码并发场景,DB中的并发场景,分布式中的锁....你知道几种呢?下面来看看常见的11种锁 1. 乐观锁/悲观锁 这两个概念是人们对java中各种锁总结提出的模型,不是特指某种类型的锁. 乐观锁预期数据的并发操作不会发生修改而不需要进行加锁的操作,悲观锁则相反.在java中的乐观锁一般采用CAS算法或者版本控制,典型的应用如原子类操作.悲观锁则应用的比较广泛如Synchronized等等. 综上: 乐观锁适用于读操作比较多的场景, 悲观锁适用于写操作比较…
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读写锁 5.乐观锁 / 悲观锁 6.分段锁 7.偏向锁 / 轻量级锁 / 重量级锁 8.自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释. 公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公…
上篇文章大致说了下 ReentrantLock 类的使用,对 ReentrantLock 类有了初步的认识之后让我们一起来看下基于 ReentrantLock 的几种细粒度锁实现. 这里我们还是接着用之前 synchronize 关键字加锁实现线程安全 文章中举的账户扣款的例子好了,不过这里为了更贴近系统的功能实现,我们换一下思路,功能实现不变,只是把钱转换成我们系统中的使用的礼券好了,用户每次在系统中购买某项功能需要支付一定的礼券.那既然要实现细粒度锁,那就意味着不同用户账户扣除礼券的操作互不…
使用方式 try { if(PublicLock.getLock(lockKey)){ //这里写代码逻辑,执行完后需要释放锁 PublicLock.freeLock(lockKey); } } catch (Exception e) { //产生异常也需要释放锁 PublicLock.freeLock(lockKey); LOGGER.error(e); } redis的分布式锁工具类的基础类 package com.qlchat.redis.cache; import java.util.*…
同一进程 重入锁 使用ReentrantLock获取锁的时候回判断当前线程是否为获取锁的线程,如果是则将同步的状态+1,释放锁的时候则将状态-1,只有将同步状态的次数置为0的时候才会是最终释放锁. 读写锁 使用ReentrantReadWriteLock,同时维护一对锁:读锁和写锁.当写线程访问时则其他所有锁都将阻塞,读线程访问时则不会.通过读写锁的分离可以很大程度的提高并发量和吞吐量. 不同进程 分布式锁:基于数据库 可以创建一张表,将其中的某个字段设置为唯一索引,当多个请求过来的时候只有新建…
前言 Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue.CopyOnWriteArrayList.LinkedBlockingQueue,它们线程安全的实现方式并非通过synchronized关键字,而是通过java.util.concurrent.locks.ReentrantLock来实现. 刚好对这个很感兴趣, 因此写一篇博客详细分析此 “可重入锁实现原理”.ReentrantLock的实现是基于其内部类FairSync(公平锁)和NonFairSync…