知道synchronized原理吗?

源码 2024-9-14 07:58:39 47 0 来自 中国
synchronized是java提供的原⼦性内置锁,这种内置的而且使⽤者看不到的锁也被称为监视器锁,使⽤synchronized之后,会在编译之后在同步的代码块前后加上monitorenter和monitorexit字节码指令,它依赖操纵体系底层互斥锁实现。它的作⽤告急就是实现原⼦性操纵和办理共享变量的内存可⻅性题目。
执⾏monitorenter指令时会尝试获取对象锁,假如对象没有被锁定大概已经得到了锁,锁的计数器+1。此时其他竞争锁的线程则会进⼊等待队列中。执⾏monitorexit指令时则会把计数器-1,当计数器值为0时,则锁开释,处于等待队列中的线程再继承竞争锁。
synchronized是排它锁,当⼀个线程得到锁之后,其他线程必须等待该线程开释锁后才气得到锁,⽽且由于Java中的线程和操纵体系原⽣线程是⼀⼀对应的,线程被壅闭大概唤醒时时会从⽤户态切换到内核态,这种转换⾮常消耗性能。
从内存语义来说,加锁的过程会清除⼯作内存中的共享变量,再从主内存读取,⽽开释锁的过程则是将⼯作内存中的共享变量写回主内存。现实上⼤部分时候我以为说到monitorenter就⾏了,但是为了更清楚的形貌,还是再具体⼀点。
假如再深⼊到源码来说,synchronized现实上有两个队列waitSet和entryList。
1. 当多个线程进⼊同步代码块时,⾸先辈⼊entryList
2. 有⼀个线程获取到monitor锁后,就赋值给当火线程,而且计数器+1
3. 假如线程调⽤wait⽅法,将开释锁,当火线程置为null,计数器-1,同时进⼊waitSet等待被唤醒,调⽤notify大概notifyAll之后⼜会进⼊entryList竞争锁
4. 假如线程执⾏完毕,同样开释锁,计数器-1,当火线程置为null
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 02:18, Processed in 0.128554 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表