说一说自己对于 synchronized 关键字的了解

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

说说自己是怎么使用 synchronized 关键字

1.修饰实例方法
2.修饰静态方法
3.修饰代码块

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

首先切换到类的对应目录执行 javac SynchronizedDemo.java 命令生成编译后的 .class 文件,
然后执行javap -c -s -v -l SynchronizedDemo.class
1.synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。
当执行 monitorenter 指令时,线程试图获取锁也就是获取 对象监视器 monitor 的持有权。
2.synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。

谈谈 synchronized 和 ReentrantLock 的区别

1.两者都是可重入锁

2.synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API

3.ReentrantLock 比 synchronized 增加了一些高级功能

1.等待可中断,lock.lockInterruptibly()
2.可实现公平锁,ReentrantLock(boolean fair)构造方法实现公平锁
3.可实现选择性通知(锁可以绑定多个条件)Condition接口与newCondition()方法

说说 synchronized 关键字和 volatile 关键字的区别

synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在!

  • volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 。
  • volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。
  • volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。