并发编程
aileitianshi
这个作者很懒,什么都没留下…
展开
-
Synchronized的锁关系
锁的状态存放于对象头中,有4中锁状态, 无锁, 偏向锁, 轻量级锁, 重量级锁.锁的状态也是依次升级且一旦升级就不会降级,偏向锁:从jdk.6加入对锁的优化手段, 偏向锁的场景为锁不存在竞争, 一个时刻总是仅有一个线程持有. 如果锁不存在竞争那么CAS的操作也是多余的.偏向锁的核心思想是当一个线程获取了锁, 那么这个锁就进入了偏向状态, 这里的"偏"就是偏心于一个线程的意思.偏向锁的获得和撤销流程获取锁步骤:1)判断锁对象是否是偏向锁(即锁标志位为01,偏向锁位为1),.原创 2020-09-28 11:03:58 · 267 阅读 · 0 评论 -
Synchronized的原理(汇编层)
原理描述:通过C++层可以了解到其常用方法为CAS方法, 比如://通过CAS尝试把monitor的`_owner`字段设置为当前线程cur = Atomic::cmpxchg_ptr (Self, &_owner, NULL) ;调用的Atomic类中的cmpxchg_ptr方法, 其实java中原子类Atomic包中的底层也是atomic.cpp这个类这里从java里Atomic包中的Unsafe类的compareAndSwapInt()方法入手直到最后的cmpxchg.原创 2020-09-28 10:56:23 · 855 阅读 · 0 评论 -
Synchronized的原理(C++层)
Synchronized的原理(C++层)原理描述:重量级锁通过对象内部的监视器(monitor)实现,其中monitor的本质是依赖于底层操作系统的Mutex Lock实现。当系统检查到锁是重量级锁之后,会把等待想要获得锁的线程进行阻塞,被阻塞的线程不会消耗cup。但是阻塞或者唤醒一个线程时,都需要操作系统来帮忙,这就需要从用户态转换到内核态,而转换状态是需要消耗很多时间的,有可能比用户执行代码的时间还要长。这就是说为什么重量级线程开销成本很高。无论是ACC_SYNCHRONIZED(方法锁)原创 2020-09-28 10:29:03 · 2483 阅读 · 0 评论 -
Synchronized的原理(字节码层)
◆synchronized: 依赖JVM◆Lock: 依赖特殊的CPU指令, 由代码实现, ReentrantLock◆以下内容主要讨论重量级锁(标志10)的原理. 偏向锁, 轻量级锁相关有空再发.synchronized的字节码pubLic class Decompilation14 { private Object object = new 0bject() ; public void insert(Thread thread) { synchro.原创 2020-09-28 10:14:38 · 109 阅读 · 0 评论