java中的锁类型

简介: java中的锁不同的分类,只是从不同的角度标准去分类的。一把锁也有可能同时占有多个标准,符合多种分类,比如ReentrantLock既是可中断锁,又是可重入锁。根据分类标准,我们把锁分为以下七个大类别。一、偏向锁、轻量级锁、重量级锁二、可重入锁、非可重入锁三、共享锁、独占锁

java中的锁不同的分类,只是从不同的角度标准去分类的。一把锁也有可能同时占有多个标准,符合多种分类,比如ReentrantLock既是可中断锁,又是可重入锁。根据分类标准,我们把锁分为以下七个大类别。

一、偏向锁、轻量级锁、重量级锁

二、可重入锁、非可重入锁

三、共享锁、独占锁

四、公平锁、非公平锁

五、悲观锁、乐观锁

六、自旋锁、非自旋锁

七、可中断锁、不可中断锁

一、偏向锁,对于一把锁来说一致不存在竞争,那么就没有必要上锁,只需要打个标记就可以,这就是偏向锁的思想。具体含义是,一个对象被初始化后,还没有任何线程来获取它的锁时,那么它就是可偏向的,当有一个线程来访问它并尝试获取锁的时候,它就将这个线程记录下来,以后如果尝试获取锁的线程正是偏向锁的拥有者,就可以直接获得锁,开销比较小,性能很好。

轻量级锁,当原来的锁是偏向锁的时候,然后又被另一个线程访问,说明存在竞争,那么偏向锁就会升级为轻量级锁,线程会通过自旋的形式尝试获取锁,而不会陷入阻塞。

重量级锁,当多个线程直接有实际竞争的时候,且锁竞争时间长的时候,轻量级锁不能满足需求,锁就会膨胀为重量级锁。重量级锁会让拿不到锁的线程进入阻塞状态。它的开销比较大,并且会造成上下文的切换。

无锁----》偏向锁----》轻量级锁-----》重量级锁

总结,偏向锁性能最好,可以避免CAS操作,轻量级锁利用了自旋和CAS避免了重量级锁带来的线程阻塞和唤醒,性能中等。重量级锁则会把获取不到锁的线程阻塞,性能最差。

二、可重入锁和非可重入锁

可重入锁是指线程要重新获得这个锁的时候,不需要释放锁再重新获取。不可重入锁指的是如果想重新获得这把锁,必须要先释放掉锁,然后再获取这把锁。典型的例子就是ReentrantLock了,它的名字一样,reentrant含义是可重入的,它是Lock接口的主要实现类。

三、共享锁、独占锁

共享锁是一把锁,可以同时被多个线程所拥有,独占锁指的是,这把锁只能被一个线程获得。常见的例子,比如我们的读锁,就是用的共享锁,写锁用的是独占锁,读锁可以被同时读取,可以同一时间被多个线程所共有,写锁最多只能同时被一个线程所持有。

四、公平锁、非公平锁

公平锁,当线程获取到这个锁的时候,线程就会进入等待状态,开始排队,并且等待时间长的线程会更早的拿到这把锁,就是先到先得。而非公平锁,它会在一定情况下,忽律排队等待,发生插队现象。

五、悲观锁、乐观锁

悲观锁,就是在获取资源之前,要拿到锁,来达到独占的状态,并且在操作资源的时候,其他线程不能拿到锁,所以线程不能影响到这,而乐观锁是不要求在获取资源前拿到锁,也不会锁住资源,乐观锁利用的是CAS原理,在不独占资源的情况下,修改资源。

六、自旋锁、非自旋锁

当线程获取锁失败的时候,并不是直接陷入阻塞状态或者释放CPU资源,而是利用循环,不停的尝试重新获取锁,这个过程比喻成了自旋锁。而非自旋锁是,线程获取不到锁后,就直接放弃,或者进行其他的处理逻辑,比如排队、陷入阻塞。

七、可中断锁、不可中断锁

不可中断锁,典型的例子就是synchronized关键字修饰的锁代表的是不可中断锁,一旦线程申请了锁,就没有回头路了,只能等到拿到锁以后才能进行其他的逻辑处理。ReentrantLock(可重入锁)是一种典型的可中断锁,例如使用lockInterruptibly方法在获取锁的过程中,突然不想获取了,那么可以在中断之后去做其他的事情,不需要一直等到获取锁才离开。

目录
相关文章
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
10天前
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
25 2
java基础(9)数据类型中的char类型以及涉及到的转义字符
|
3天前
|
存储 安全 Java
Java 数据结构类型总结
在 Java 中,常用的数据结构包括基础数据结构(如数组和字符串)、集合框架(如 Set、List 和 Map 接口的多种实现)、特殊数据结构(如栈、队列和双端队列)、链表(单链表、双链表和循环链表)以及图和树等。这些数据结构各有特点和适用场景,选择时需考虑性能、内存和操作需求。集合框架提供了丰富的接口和类,便于处理对象集合。
|
21天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
9天前
|
算法 Java 关系型数据库
Java中到底有哪些锁
【9月更文挑战第24天】在Java中,锁主要分为乐观锁与悲观锁、自旋锁与自适应自旋锁、公平锁与非公平锁、可重入锁以及独享锁与共享锁。乐观锁适用于读多写少场景,通过版本号或CAS算法实现;悲观锁适用于写多读少场景,通过加锁保证数据一致性。自旋锁与自适应自旋锁通过循环等待减少线程挂起和恢复的开销,适用于锁持有时间短的场景。公平锁按请求顺序获取锁,适合等待敏感场景;非公平锁性能更高,适合频繁加解锁场景。可重入锁支持同一线程多次获取,避免死锁;独享锁与共享锁分别用于独占和并发读场景。
|
10天前
|
Java
java基础(10)数据类型中的整数类型
Java中的整数类型包括byte、short、int和long。整数字面值默认为int类型,加L表示long类型。整数字面值可以是十进制、八进制(0开头)或十六进制(0x开头)。小容量类型(如int)可自动转换为大容量类型(如long),但大容量转小容量需强制转换,可能导致精度损失。
22 2
|
13天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
17天前
|
Java 数据库
JAVA并发编程-一文看懂全部锁机制
曾几何时,面试官问:java都有哪些锁?小白,一脸无辜:用过的有synchronized,其他不清楚。面试官:回去等通知! 今天我们庖丁解牛说说,各种锁有什么区别、什么场景可以用,通俗直白的分析,让小白再也不怕面试官八股文拷打。
|
17天前
|
安全 Java 开发者
Java并发编程中的锁机制解析
本文深入探讨了Java中用于管理多线程同步的关键工具——锁机制。通过分析synchronized关键字和ReentrantLock类等核心概念,揭示了它们在构建线程安全应用中的重要性。同时,文章还讨论了锁机制的高级特性,如公平性、类锁和对象锁的区别,以及锁的优化技术如锁粗化和锁消除。此外,指出了在高并发环境下锁竞争可能导致的问题,并提出了减少锁持有时间和使用无锁编程等策略来优化性能的建议。最后,强调了理解和正确使用Java锁机制对于开发高效、可靠并发应用程序的重要性。
16 3
|
2月前
|
存储 Java
Java锁是什么?简单了解
在高并发环境下,锁是Java中至关重要的概念。锁或互斥是一种同步机制,用于限制多线程环境下的资源访问,确保排他性和并发控制。例如,超市储物柜仅能存放一个物品,若三人同时使用,则需通过锁机制确保每次只有一个线程访问。Java中可以通过`synchronized`关键字实现加锁,确保关键代码段的原子性,避免数据不一致问题。正确使用锁可有效提升程序的稳定性和安全性。
Java锁是什么?简单了解
下一篇
无影云桌面