无竞争场景不用锁不就可以了?为什么要多此一举呢?
花了一天时间按照层次整理了一下锁相关的内容
1
Jooooooooo 2020-11-30 17:55:36 +08:00
你完全理解错了
无竞争是事后才知道的 |
2
shangzhanyu OP @Jooooooooo 怎么讲?
|
3
ApachW 2020-11-30 18:11:07 +08:00
应该是开始没并发,线程一个执行完了过了会才来一个,这时候是轻量锁,然后程序跑着跑着并发来了,锁就升级了
|
4
liuch 2020-11-30 18:21:49 +08:00
使用锁的目的是为了保证竞争下面的数据安全,这个是大前提。
但是在某些场景下,竞争可能不存在或者不激烈。这种情况下,使用重量级锁性能不佳,也没有必要 轻量级锁 是优化处理这种情况。后面可能会有的 线程的竞争,就会有锁升级的情况发生。 |
5
shangzhanyu OP @ApachW 那直接使用互斥锁不是更好吗
|
6
hdbzsgm 2020-11-30 18:34:39 +08:00
@shangzhanyu 开销 /性能
|
7
wuketidai 2020-11-30 18:53:31 +08:00
乐观锁?
|
8
SuperManNoPain 2020-11-30 19:02:58 +08:00
不用切换到内核态,maybe
|
9
kkkkkrua 2020-11-30 19:17:47 +08:00
你加了锁之后,这个锁是肯定存在的,这是前提
然后是,存在后,因为没竞争,所以此时的锁是偏向 /轻量锁 后面才是有竞争后,会锁升级。 不知道这么讲你理解不 |
11
nicoley 2020-11-30 20:23:11 +08:00
@shangzhanyu 直呼好家伙!你用互斥锁考虑过系统整体的并发吗?
|
12
jtchris 2020-11-30 20:44:53 +08:00 1
偏向锁没法在应用中吧(至少我不会...),是 JVM 为了优化性能搞得。你加了锁,但是程序实际运行中发现,就一个线程访问,并没有其它线程来竞争,为了提高性能就不搞同步那些了。
比如你去饭馆买饭,收银员给你发了号码,服务员叫号上菜,当就你一个顾客时,服务员就没叫号直接给你端上来了,省了他叫号和你回答的步骤,提高了上菜速度。 |
14
goodboy95 2020-12-01 09:10:27 +08:00
轻量级锁对于 1 个线程来说确实等于没有锁啊,人家自旋的是第二个线程
|
15
nicoley 2020-12-01 09:54:44 +08:00
在实际场景中,你不可以预测后面有没有线程来抢夺资源吧,如果后面随着线程竞争加剧还会出现锁升级等等。所以用轻量级锁的目的就是防微杜渐。
|
16
securityCoding 2020-12-01 10:08:38 +08:00
一楼说的狠明白 ,一开始你怎么知道有没有狗子跟你抢东西吃呢
|
17
shangzhanyu OP @nicoley 这么解释能理解了,为了防止可能出现的竞争场景,一般在什么场景下使用?
|
18
shangzhanyu OP @securityCoding 比如什么场景呢?
|
19
securityCoding 2020-12-01 10:21:32 +08:00
@shangzhanyu 当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。
|
20
securityCoding 2020-12-01 10:23:43 +08:00
@shangzhanyu 抱歉看错了。
偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。 在大多数情况下,锁总是由同一线程多次获得,不存在多线程竞争,所以出现了偏向锁。其目标就是在只有一个线程执行同步代码块时能够提高性能。 从这篇文章( https://tech.meituan.com/2018/11/15/java-lock.html )看来的,美团的技术文章写的都挺不错的。 |
21
shangzhanyu OP @jtchris 意思是这些是 jvm 对锁的优化,应用中没有对应的使用方式是吗?
|
22
jtchris 2020-12-01 20:34:55 +08:00
@shangzhanyu 这是 JVM 源码的实现,JDK 是没有这类 API 的。
|