synchronized 关键字5连击

大城市里の小女人 提交于 2020-11-03 16:20:00

说说自己对synchronized关键字的理解

synchronized关键字解决的是多个线程之间的访问资源的互斥性,synchronized可以保证被它修饰的方法或者代码块在任意时刻只有一个线程执行

在早期的Java版本中,synchronized属于重量级锁,效率低下,因为监视器锁是依赖于底层的操作系统的Mutex  Lock来实现的,Java的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而实现操作系统之间的切换时需要从用户态转换到内核态,这个状态转换就需要相对较长的时间来完成,时间成本相对较高,这也就是为什么早期的synchronized效率底下的原因。在Java6之后Java 官方对JVM层面对synchronized较大优化,所以现在的synchronized锁效率也优化的不错了。jdk1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、消除锁、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。

说说自己是怎么使用synchronized关键字的  在项目中用到了么?

synchronized关键字主要有三种使用形式:
 * 作用于当前实例加锁,进入同步代码块前要获得当前对象实例的锁

 * 修饰静态方法 作用于当前类对象加锁,进入同步代码块前首先要获得当前类对象的锁。

 * 修饰代码块,指定锁对象,对给定对象加锁,进入同步代码块前要获得给对象加锁。

下面已一个常见的面试题为例来讲解synchronized 关键字的具体使用。

面试管通常会说:单例模式了解么    来手写一个  给我解释一下双重检验锁方式实现单例模式的原理呗。

双重校验锁实现对象单例  (线程安全)

 

讲一下synchronized关键字的底层原理

synchronized关键字底层原理属于JVM层面

1 synchronized 同步代码块的情况

通过JDK自带的javap命令查看SynchronizedDemo类查看相关字节码的信息,首先切换到类的对应目录执行 javac  synchronizedDemo.java 命令生成编译后的.class文件 然后执行javap -c -s -v -l  synchronizedDemo.class

从图中可以看出  synchronized同步代码块的实现使用的是monitorenter和monitorexit 指令,其中monitorenter指定指向同步代码块的开始位置

2 synchronized修饰方法的情况

synchronized修饰方法时并没有monitorenter指令和monitorexit指令,取而代之的是ACC_SYNCHRONIZED标识,该标识指明了该方法是一个同步方法 JVM通过ACC_SYNCHRONIZED访问标志来辨别一个方法是否为同步方法,从而执行相应的同步调用

Java1.6之后的Synchronized关键字做了哪些优化   能详细介绍么?
JDK1.6对锁的优化实现了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销

锁主要有四种状态,依次是 无状态锁  偏向锁状态   轻量级锁状态   重量级锁状态   它们会随着竞争的激烈而逐渐升级,锁是可升级而不能降级,这种策略是为了提高获得锁和释放锁的效率。

https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484838&idx=1&sn=54b33b4c76e136efac09941b2dd346b3&source=41#wechat_redirect

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!