synchronized和ReentrantLock底层原理差别

网上很多synchronized和ReentrantLock使用和编程时写法差异的总结,这里就不列举了;

这里主要列举一下在底层实现上的一些区别:

1、synchronized

synchronized关键字需要一个引用类型的参数,这个参数也叫做监听器(monitor);JVM通过这个监听器来管理所有需要同步的线程(synchronized这个监听器的所有线程)运行状态,成功占有该monitor的线程即成为该监听器的owner,其他线程则被状态切换至阻塞状态并维护在一个队列中准备下一次的竞争;

大家知道线程在不同状态之间切换是比较消耗cpu资源的,所以使用synchronized处理较大并发的场景性能开销是比较大的;

(大致可以这样理解,如果有兴趣可以查看反编译带有synchronized的class文件,内在实现还是挺复杂的)

2、ReentrantLock

多个线程调用同一个ReentrantLock对象的lock()方法时,大致原理是每个线程都尝试去修改锁对象内一个状态属性state(继承自java.util.concurrent.locks.AbstractQueuedSynchronizer)的值,这个修改过程采用了CAS(compare  and swap)技术即每个线程都想把这个变量从数值0改变成1;

如果一个线程修改成功则成功锁对象的owner,否则

时间: 2024-11-06 23:45:10

synchronized和ReentrantLock底层原理差别的相关文章

Java多线程和并发(八),synchronized底层原理

目录 1.对象头(Mark Word) 2.对象自带的锁(Monitor) 3.自旋锁和自适应自旋锁 4.偏向锁 5.轻量级锁 6.偏向锁,轻量级锁,重量级锁联系 八.synchronized底层原理 1.对象头(Mark Word) 2.对象自带的锁(Monitor) (1)javap反编译查看原理同步代码块 public class SyncBlockAndMethod { public void syncsTask() { synchronized (this) { System.out.

面试必备:synchronized的底层原理?

最近更新的XX必备系列适合直接背答案,不深究,不喜勿喷. 你能说简单说一下synchronize吗? 可别真简单一句话就说完了呀~ 参考回答: synchronize是java中的关键字,可以用来修饰实例方法.静态方法.还有代码块:主要有三种作用:可以确保原子性.可见性.有序性,原子性就是能够保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等该线程处理完数据后才能进行:可见性就是当一个线程在修改共享数据时,其他线程能够看到,保证可见性,volatile关键字也有这个功能:有序性就是,被s

ReentrantLock实现原理深入探究

前言 这篇文章被归到Java基础分类中,其实真的一点都不基础.网上写ReentrantLock的使用.ReentrantLock和synchronized的区别的文章很多,研究ReentrantLock并且能讲清楚ReentrantLock的原理的文章很少,本文就来研究一下ReentrantLock的实现原理.研究ReentrantLock的实现原理需要比较好的Java基础以及阅读代码的能力,有些朋友看不懂没关系,可以以后看,相信你一定会有所收获. 最后说一句,ReentrantLock是基于A

ReentrantLock实现原理及源码分析

ReentrantLock是Java并发包中提供的一个可重入的互斥锁.ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性.只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon. 可重入性/公平锁/非公平锁 可重入性 所谓的可重入性,就是可以支持一个线程对锁的重复获取,原生的synchronized就具有可重入性,一个用synchronized修饰

【Java并发编程】15、ReentrantLock实现原理深入探究

原文已经写得非常详细了,直接把大神的文章转发过来了  https://www.cnblogs.com/xrq730/p/4979021.html 前言 这篇文章被归到Java基础分类中,其实真的一点都不基础.网上写ReentrantLock的使用.ReentrantLock和synchronized的区别的文章很多,研究ReentrantLock并且能讲清楚ReentrantLock的原理的文章很少,本文就来研究一下ReentrantLock的实现原理.研究ReentrantLock的实现原理需

MVC底层原理

窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时缓存数据或者页面之间传递消息.也都知道TempData是用Session来实现的,既然是用Session来实现的,那么模式就是线程模式,这样的Session是没法用到分布式系统中的,那么在多台机器上部署,怎么做到Session在多台机器中共存,这就涉及到分布式存储.那该如何实现TempData的分布

synchronized和ReentrantLock的区别

synchronized和ReentrantLock的区别 synchronized是和if.else.for.while一样的关键字,ReentrantLock是类,这是二者的本质区别. 既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承.可以有方法.可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上: (1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁 (2)Re

并发编程艺术-锁类型以及底层原理

Java并发编程艺术-并发机制的底层原理实现 1.Volatile 定义: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量. volatile借助Java内存模型保证所有线程能够看到最新的值.(内存可见性) 实现原理: 将带有volatile变量操作的Java代码转换成汇编代码后,可以看到多了个lock前缀指令(X86平台CPU指令).这个lock指令是关键,在多核处理器下实现两个重要操作: 1.将当前处理器缓存行的数据写回到系

计算机底层原理杂谈(白话文)

简单说一下写这篇文章的缘由.首先这个不是教学类型的,是我Java实在学不下去了,因为好多计算机底层原理都不是很清楚,每次学新东西都由于想不明白底层原理困惑,所以下决心停止学习Java的新东西,开始搞明白底层.一开始搞的所谓的底层是“Java虚拟机”,然后又C语言汇编语言什么的,其实是想图快,尽快接近现在做的事情.后来发现不行,这事快不了,所以干脆就从物理层面用导线灯泡集成芯片开始动手做一个cpu开始吧.其实也没多久,大概三个多月吧,从我之前写的[从零开始自制cpu]系列的学习文章也可以看到开始时