java并发锁-编程思维

java并发锁
序号 锁名称 应用
1 乐观锁 CAS
2 悲观锁 synchronized、vector、hashtable
3 自旋锁 CAS
4 可重入锁 synchronized、Reentrantlock、Lock
5 读写锁 ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet
6 公平锁 Reentrantlock(true)
7 非公平锁 synchronized、reentrantlock(false)
8 共享锁 ReentrantReadWriteLock中读锁
9 独占锁 synchronized、vector、hashtable、ReentrantReadWriteLock中写锁
10 重量级锁 synchronized
11 轻量级锁 锁优化技术
12 偏向锁 锁优化技术
13 分段锁 ConcurrentHashMap
14 互斥锁 synchronized
15 同步锁 synchronized
16 死锁 相互请求对方的资源
17 锁粗化 锁优化技术
18 锁消除 锁优化技术

乐观锁是一种乐观思想,假定当前环境是读多写少,遇到并发写的概率比较低,读数据时认为别的线程不会正在进行修改(所以没有上锁)。写数据时,判断当前 与期望值是否相同,如果相同则进行更新(更新期间加锁,保证是原子性的)。

悲观锁是一种悲观思想,即认为写多读少,遇到并发写的可能性高,每次去拿数据的时候都认为其他线程会修改,所以每次读写数据都会认为其他线程会修改,所以每次读写数据时都会上锁。其他线程想要读写这个数据时,会被这个线程block,直到这个线程释放锁然后其他线程获取到锁。

自旋锁是一种技术: 为了让线程等待,我们只须让线程执行一个忙循环(自旋)。不放弃处理器的执行时间,避免了线程切换的开销

可重入锁是一种技术: 任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞。

读写锁是一种技术: 通过ReentrantReadWriteLock类来实现。为了提高性能, Java 提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率。读写锁分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由 jvm 自己控制的。

公平锁是一种思想: 多个线程按照申请锁的顺序来获取锁。在并发环境中,每个线程会先查看此锁维护的等待队列,如果当前等待队列为空,则占有锁,如果等待队列不为空,则加入到等待队列的末尾,按照FIFO的原则从队列中拿到线程,然后占有锁。

非公平锁是一种思想: 线程尝试获取锁,如果获取不到,则再采用公平锁的方式。多个线程获取锁的顺序,不是按照先到先得的顺序,有可能后申请锁的线程比先申请的线程优先获取锁。

共享锁是一种思想: 可以有多个线程获取读锁,以共享的方式持有锁。和乐观锁、读写锁同义。

独占锁是一种思想: 只能有一个线程获取锁,以独占的方式持有锁。和悲观锁、互斥锁同义。

重量级锁是一种称谓synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的,监视器锁本身依赖底层的操作系统的 Mutex Lock来实现。操作系统实现线程的切换需要从用户态切换到核心态,成本非常高。这种依赖于操作系统 Mutex Lock来实现的锁称为重量级锁。为了优化synchonized,引入了轻量级锁偏向锁

轻量级锁JDK6时加入的一种锁优化机制: 轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量。轻量级是相对于使用操作系统互斥量来实现的重量级锁而言的。轻量级锁在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。如果出现两条以上的线程争用同一个锁的情况,那轻量级锁将不会有效,必须膨胀为重量级锁。

偏向锁JDK6时加入的一种锁优化机制: 在无竞争的情况下把整个同步都消除掉,连CAS操作都不去做了。偏是指偏心,它的意思是这个锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁一直没有被其他的线程获取,则持有偏向锁的线程将永远不需要再进行同步。持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作(例如加锁、解锁及对Mark Word的更新操作等)。

Java中的乐观锁

CAS,比较并替换,比较当前值主内存中的值),与预期值当前线程中的值,主内存中值的一份拷贝)是否一样,一样则更新,否则继续进行CAS操作。

Java中的悲观锁

synchronized修饰的方法和方法块、ReentrantLock

Java中的自旋锁

CAS操作中的比较操作失败后的自旋等待。

Java中的可重入锁

ReentrantLocksynchronized修饰的方法或代码段。

Java中的读写锁

ReentrantReadWriteLock

Java中的非公平锁

synchronized是非公平锁,ReentrantLock通过构造函数指定该锁是公平的还是非公平的,默认是非公平的。

Java中的共享锁

ReentrantReadWriteLock

Java中用到的独占锁

synchronized,ReentrantLock

Java中的重量级锁

synchronized

原文链接:5000字 | 24张图带你彻底理解Java中的21种锁

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议 转载请注明原文链接: https://www.cnblogs.com/geekdc/p/13617368.html

volatile底层实现原理-编程思维

内存屏障 原文地址 作者:Martin Thompson 译者:一粟 校对:无叶,方腾飞 本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术。 CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度。在上一篇文章

java死锁-编程思维

一、死锁产生的四个必要条件 1.1、互斥 即当资源被一个线程使用(占有)时,别的线程不能使用 1.2、不可剥夺 资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 1.3、请求和保持 即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 1.4、循环等待 即存在一个等待闭环链路:P1占有P

java并发工具类-编程思维

一、CountDownLatch 字面意思:倒计时锁闩,该类可以实现一个线程在等其他多个线程执行完之后,继续执行。 入参是一个计数器的值,当一个线程执行完毕时调用countDown()方法,计数器值会减1,当计数器值为0时,被await()阻塞的线程将被唤醒。 CountDownLatch latch = new Co

Java编程的逻辑 (66) - 理解synchronized-编程思维

​本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http://item.jd.com/12299018.html 上节我们提到了多线程共享内存的两个问题,一个是竞态条件,另一个是内存可见