多线程
synchronized关键字的底层原理?
✔ Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】 ✔ 其它线程再想获取这个【对象锁】时就会阻塞住 ✔ 他是可重入锁(准许中途去执行别的逻辑,执行完毕后继续回来执行当前逻辑) ❒ Monitor 被翻译为监视器,是由jvm提供,c++语言实现,Monitor结构如下: ✔ Owner: 存储当前获取锁的线程的,只能有一个线程可以获取 ✔ EntryList: 关联没有抢到锁的线程,处于Blocked状态的线程 ✔ WaitSet: 关联调用了wait方法的线程,处于Waiting状态的线程 对于每一个Java对象都可以绑定一个Monitor对象(锁),当多个线程来执行被synchronized修饰的同步代码块时,根据JDK的调度机制会选取其中一个线程来作为该对象绑定的Monitor对象的拥有者(Owner),并且一个Monitor对象只能有一个锁主人(Owner),然后该线程便获得了执行该同步代码块的权利,而对于那些没有被选中的线程则会放入一个等待队列(EntryList)中进行等待,只有当前线程完成工作后才会更新调度规则选出新的Owner。
❒ synchronized关键字的底层原理 1. 阶段1:偏向锁(默认状态,像“私人厕所”) 2. 阶段2:轻量级锁(轻度竞争,像“朋友间快速协商”) 3. 阶段3:重量级锁(重度竞争,像“请管理员来管”) 4. 是一种不公平锁 5. 是一种可重入锁 6. 不是读写锁