说说自己对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对锁的优化实现了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销
锁主要有四种状态,依次是 无状态锁 偏向锁状态 轻量级锁状态 重量级锁状态 它们会随着竞争的激烈而逐渐升级,锁是可升级而不能降级,这种策略是为了提高获得锁和释放锁的效率。
来源:oschina
链接:https://my.oschina.net/u/4523593/blog/4701246