网站首页 > 精选教程 正文
一 偏向锁,轻量级锁,重量级锁
这三种锁特指 synchronized 锁的状态,通过java对象的头mark world 来标识锁状态。
偏向锁 有时候我们加锁了,但是实际上却不存在竞争,所以没必要上锁,只要打个标识即可,这就是偏向锁的思想。如果一个对象初始化后,还没有任何线程来访问它,它就是可偏向的,第一个线程来访问它的时候,就把这个线程记录下来,如果下次仍然是这个线程访问,因为它是这个偏向锁的拥有者,所以直接获取锁,开销很小。
轻量级锁 如果synchronized 是被java的多个线程交替访问,不是同时竞争的,或者竞争的时间短,用CAS(Compare And Set)方式来轮询获取锁,不用经过上下文切换,这种时候没必要用重量级锁。
轻量级锁指原来是偏向锁,这时候一个非偏向锁拥有者的线程来访问对象,那么这个偏向锁就升级为轻量级锁,即通过轮询方式来获取锁,不用阻塞。
重量级锁 对于竞争比较激烈的场景,采用轻量级锁就需要等待很长时间的空转,这时候适合用重量级锁。它利用重量级锁的同步机制实现,开销比较大。
锁升级
总结: 偏向锁性能最好不用CAS操作,轻量级锁利用CAS和自旋避免重量级操作,性能次之;重量级锁利用系统实现,需要上下文切换,最终,性能最差。
二 可重入锁/非可重入锁
可重入锁即获取锁的线程,不释放锁的情况下,可以再次获取这个锁。非可重入锁即线程获取锁之后,只能释放了锁之后,才能再次获取锁。
ReentrantLock 即可重入锁。
三 共享锁、独占锁
共享锁是可以同时被多个线程同时占有的锁,独占锁即只能被一个线程所占有。我们常用的读写锁,读锁属于共享锁,可以同时被多个线程占有,写锁属于独占锁,只能被一个线程所占用。
四 公平锁、非公平锁
如果锁已经被占用,后续要获取锁的线程就会等待,开始排队,如果锁被释放后,等待时间最长的线程获取锁,这就是公平锁,非公平锁会在一定情况下准许插队的情况。
五 悲观锁和乐观锁
悲观锁即在获取资源之前,先获取锁,然后就进行操作,这样保证其他想操作的线程因为没有获取锁,所以无法操作。乐观锁,倾向于认为竞争不激烈,它不要求操作资源前先获取锁,而是直接用CAS操作,即更新的时候判断值是不是原来获取的值,如果是就直接修改(判断和更改是原子操作),如果不是就重试,在不独占的时候就完成了资源的修改。
六 自旋锁和非自旋锁
自旋锁的理念是如果线程拿不到锁,不会阻塞或释放 CPU 资源而是采用循环等待的方式,不断获取锁,这种方式即为自旋,我理解即为不停止循环判断锁是否释放了;非自旋锁,如果没有获取锁,则会进入阻塞或做其他事情。
七 可中断锁和不可中断锁
java中synchronized 关键字修饰的锁为不可中断锁,一旦线程申请了锁,需要等获取锁之后执行完毕逻辑后,不可以被中断。 ReentrantLock 即可中断锁,在获取锁的过程中,可以被中断,不用必须等待其他线程释放锁后,再获取锁。
- 上一篇: 超详细讲解MySQL中的锁机制 小白都能一把读懂
- 下一篇: MySQL-锁机制详述
猜你喜欢
- 2024-11-21 Java中的重重“锁”事
- 2024-11-21 线程进阶:多任务处理——Java中的锁(Unsafe基础)
- 2024-11-21 深入理解MySQL锁机制原理
- 2024-11-21 Java并发锁的原理,你所不知道的Java“锁”事
- 2024-11-21 阿里二面:你知道Java中的同步与锁机制详解?
- 2024-11-21 知识点深度解读系列-JAVA锁
- 2024-11-21 图解Java中的锁:什么是死锁?怎么排查死锁?怎么避免死锁?
- 2024-11-21 Java锁与线程的那些“不可描述”的事儿
- 2024-11-21 让人闻风丧胆的 Mysql 锁机制
- 2024-11-21 Java中各种锁的理解
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)