Synchronized是什么
各位Java读者,对于synchronized关键字并不陌生,在各种中间件源码或者JDK源码中都能看到,对于不熟悉synchronized的读者只知道在多线程中需要使用到synchronized关键字,知道synchronized能够保证线程安全。
称之为:互斥锁(同时只能一个线程执行,其他的线程将会等待)
又称之为:悲观锁(同时只能一个线程执行,其他的线程将会等待)
JVM虚拟机帮你实现,开发者只需要使用synchronized关键字即可。
使用时需要用一个对象当锁的互斥量
能够保证一段代码(临界区)的原子性+可见性。
从字节码层面解析Synchronized关键字
从案例入手,最合适不过。
class Demo1{ // 互斥对象 static Object object = new Object(); // 竞争条件 static int cout = 0; public static void main(String[] args) { // 互斥 synchronized(object){ // 以下是临界区 cout++; System.out.println("synchronized"); } } }
仅仅从Java代码,我们并不能看出啥东西,而Java程序编译后是字节码文件,所以我们解析一遍字节码
以上是字节码全解,其实很简单,最终Synchronized关键字解析成字节为monitorenter和monitorexit字节码指令,然后每次执行这2个字节码指令前,把互斥对象压入操作数栈供给monitorenter和monitorexit字节码指令使用。
所以下一篇就是去Hotspot源码中解析monitorenter和monitorexit字节码指令的详细流程。
Synchronized与ReentrantLock的区别
这是一道很常见的面试题,面试被问到的频率非常高
相似点:
都是互斥锁的实现
不同点:
Synchronized基于JVM内部实现,ReentrantLock基于Java层面实现(但是ReentrantLock核心代码还是调用C++代码)。
Synchronized在1.6以后经过优化,存在几个不同级别的锁,根据线程竞争的力度提升锁的力度(俗称锁升级),更多的适合场景,而ReentrantLock在锁力度选择上略显死板。
ReentrantLock虽然在锁力度选择上略显死板,但是可以选择公平和非公平,而Synchronized只能是非公平锁
ReentrantLock的条件等待队列,可创建多个,高定制化。而Synchronized底层只有一个队列。
ReentrantLock需要用户手动开启锁,手动释放锁。而Synchronized关键字底层通过字节码自动实现
以上就是Java Synchronized是什么的详细内容,更多请关注Work网其它相关文章!