多线程中 synchronized 锁升级的原理是什么?
时间:2022-11-24 09:30:00
文章目录
- 多线程中 synchronized 锁升级的原理是什么?
-
-
-
- synchronized 锁升级原理
- 升级锁的目的
- 产生死锁的四个必要条件
-
-
- 关于线程上下文切换
-
-
-
- 上下文切换
-
-
- 我的学习论坛
多线程中 synchronized 锁升级的原理是什么?
synchronized 锁升级原理
锁对象头内有一个 threadid 第一次访问时,字段 threadid 为空,jvm 让它持有偏向锁,并将 threadid 设置为其线程 id,再次进入时,会先判断 threadid 是否与其线程 id 一致的,如果一致的话,可以直接使用这个对象,如果不一致为轻量级锁,锁是通过一定次数的自旋循环获得的。执行一定次数后,如果没有正常获得要使用的对象,锁将从轻量级升级为重量级锁,这个过程构成 synchronized 锁的升级。
升级锁的目的
锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 采用偏向锁升级为轻量级锁后升级为重量级锁,从而降低了锁带来的性能消耗。
产生死锁的四个必要条件
1) 互斥条件:一个资源只能一次访问一个过程。 2) 请求与维护: 当一个过程因要求资源而被阻塞时,已获得的资源将被保留。 3) 不得剥夺:在使用过程中获得的资源不得强行剥夺。 4) 循环等待:循环等待资源关系在几个过程之间形成。 了解死锁的原因,特别是产生死锁的四个必要条件,可以最大限度地避免、预防和 解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确 合理分配资源的算法,避免过程永久占用系统资源。此外,还应防止过程处于等待状态 占用资源。因此,应合理规划资源的分配。
关于线程上下文切换
上下文切换
在多线程编程中,一般线程的数量大于 CPU 核心数,一个 CPU 为了有效地执行这些线程,核心只能在任何时候使用,CPU 策略是将时间片分配到每个线程并旋转。当一个线程的时间片用完时,它将重新处于就绪状态,供其他线程使用。这个过程属于上下文切换。
综上所述,当前任务已经完成 CPU 在将时间片切换到另一个任务之前,您将首先保存您的状态,以便在下次切换任务时再次加载任务状态。从保存到再加载的任务过程是上下文切换。
由于资金有限,购买的云服务器为1核2G是的,核心是1,它只能在任何时候使用一个线程。运行多线程会导致上下文切换,因此无法实现平行效果。单核运行多线程可能导致执行效率低于单线程,因此不建议在项目中使用多线程。
我的学习论坛
HandsomeForum:用Java写学习论坛,打造自己的圈子!(http://huangjunjie.vip:66)
文章链接(多线程) synchronized 锁升级的原理是什么?http://huangjunjie.vip:66/question/read/nt2pn5mojclyvag1vv
文章链接(关于线程上下文切换):http://huangjunjie.vip:66/question/read/qs7ho1rcy8jqhapi9m