2022
08-04
08-04
java锁升级过程过程详解
目录1.说到锁升级的过程,我们就得说一下对象头对象头对象头的存在形式接下来让我们看看锁升级的过程专业版解释我通过马士兵老师讲的带味道的栗子大致懂了这个过程(菜鸟版理解)总结1.说到锁升级的过程,我们就得说一下对象头对象头java对象保存在内存中,由3个部分组成:1.对象头2.实例数据3.对齐填充字节4.如果是数组还包含数组长度对象头的存在形式让我们先看看图,主要来说一下MarkWordmarkword8bytesclasspo...
继续阅读 >
目录乐观锁和悲观锁读写锁重量解锁和轻量级锁自旋锁公平锁和非公平锁可重入锁和不可重入锁死锁CAS(compareandswap)比较并交换synchronized的锁升级过程总结乐观锁和悲观锁乐观锁:这个锁认为出现锁竞争的概率比较低(当前线程中,线程数量较少,不太涉及竞争,就偶尔竞争一下)悲观锁:这个所认为出现锁竞争的概率比较大(当前场景中,线程数目比较多,可能涉及竞争)读写锁普通的锁提供两个操作:加锁,解锁读写锁提供三个操...
目录一、悲观锁和乐观锁1.1.乐观锁1.2.悲观锁二、公平锁和非公平锁三、可重入锁(递归锁)四、自旋锁五、独占锁(写)/共享锁(读)六、什么是阻塞队列?七、阻塞队列(BlockingQueue)一、悲观锁和乐观锁1.1.乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,乐观锁在Java...
可重入锁 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。我的理解就是,某个线程已经获得某个锁,可以无需等待而再次获取锁,并且不会出现死锁(不同线程当然不能多次获得锁,需要等待)。简单的说,就是某个线程获得某个锁,之后可以不用等待而再次获取锁且不会出现死锁。常见的可重入锁Synchronized和Reent...
目录一、常见的锁策略1.1乐观锁1.2悲观锁1.3读写锁1.4公平锁与非公平锁1.5自旋锁(SpinLock)1.6可重入锁1.7相关题目二、CAS问题2.1什么是CAS问题2.2CAS是怎么实现的2.3CAS有哪些应用2.3.1实现自旋锁三、ABA问题3.1什么是ABA问题3.2实现ABA问题场景四、总结一、常见的锁策略1.1乐观锁乐观锁:乐观锁假设认为数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并发冲突进行...
目录一、悲观锁二、乐观锁三、CAS四、AtomicXXX五、CAS中的ABA问题六、ABA问题解决方案七、使用CAS会引起的问题八、Synchronized锁优化九、偏向锁十、轻量级锁十一、重量级锁一、悲观锁悲观锁顾名思义是从悲观的角度去思考问题,解决问题。它总是会假设当前情况是最坏的情况,在每次去拿数据的时候,都会认为数据会被别人改变,因此在每次进行拿数据操作的时候都会加锁,如此一来,如果此时有别人也来拿这个数据的时候就会阻塞知道...
目录一、首先看图二、lock()跟踪源码2.1非公平锁实现2.1.1tryAcquire(arg)2.1.2acquireQueued(addWaiter(Node.EXCLUSIVE),arg)2.2公平锁实现2.2.1tryAcquire(arg)一、首先看图二、lock()跟踪源码这里对公平锁和非公平锁做了不同实现,由构造方法参数决定是否公平。publicReentrantLock(booleanfair){sync=fair?newFairSync():newNonfairSync();}2.1非公平锁实现staticfinalclassNonfairSyncextends...