说说对于 synchronized 关键字的了解?
synchronized关键字解决的是多个线程之间访问资源的同步性;
synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
synchronized保证了对变量操作的可见性,原子性和有序性。
synchronized 的使用方式有三种:
(1)修饰同步代码块
(2)修饰非静态(实例)的方法
(3)修饰静态的方法
eg;双重校验锁实现单例模式使用到了synchronized
菜鸟教程 --https://www.runoob.com/design-pattern/singleton-pattern.html
-- https://www.cnblogs.com/qdhxhz/p/9175159.html
-- https://new.qq.com/rain/a/20190923A058BQ00
Lock和synchronized的区别
(1)synchronized是Java中的关键字,在JVM层面,而Lock是一个接口;
(2)synchronized会自动释放线程占有的锁,而Lock需要主动通过unLock()去释放锁,否则可能造成死锁现象。
(3)使用synchronized时,等待的线程会一直等待下去,不能够响应中断,而Lock可以让等待锁的线程响应中断;
(4)通过Lock可以判断锁状态,即是否成功获取锁,而synchronized无法判断。
(5)Lock可以提高多个线程进行读操作的效率。
说明:在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况。
synchronized和Lock底层实现?
在 Java 中每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程其实就是竞争 monitor 对象的过程,被synchronized修饰的代码块,在执行之前先使用monitorenter指令加锁,然后在执行结束之后再使用monitorexit指令释放锁资源,在整个执行期间此代码都是锁定的状态,这就是典型悲观锁的实现流程。
lock锁使用的是CAS和volatile来实现同步的,CAS使用硬件命令实现缓存一致性保证了原子性,volatile保证了可见性,多线程环境下所有的线程通过CAS进行竞争资源,只能有一个成功,其它的都会自旋。
synchronized 是哪种锁的实现?为什么?
答:synchronized 是悲观锁的实现,因为 synchronized 修饰的代码,每次执行时会进行加锁操作,同时只允许一个线程进行操作,所以它是悲观锁的实现。
synchronized 使用的是公平锁还是非公平锁?
答:synchronized 使用的是非公平锁,并且是不可设置的。公平锁由于有挂起和恢复所以存在一定的开销(非公平锁的吞吐量大于公平锁),因此性能不如非公平锁。,并且是主流操作系统线程调度的基本选择,所以这也是 synchronized 使用非公平锁原由。
volatile 对比 synchronized 有什么区别?
(1) synchronized即保证了数据的可见性也保证了原子性,volatile能保证对变量操作的可见性,但不能完全保证原子性。比如,i++ 如果使用 synchronized 修饰是线程安全的,而 volatile 会有线程安全的问题。
(2) volatile只能修饰变量,synchronized可以修饰变量,方法以及代码块。
(3) volatile在多线程中不会存在阻塞问题,synchronized会存在阻塞问题。
(4) volatile解决的是多个线程之间对变量操作的可见性,而synchroized解决的是多个线程之间访问资源的同步性。
推荐/参考:
拉钩教育 -- java面试真题及源码
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59#/detail/pc?id=1766
关键字synchronized解析 --
https://juejin.im/post/5b42c2546fb9a04f8751eabc
一文带你理解 Java 中 Lock 的实现原理 --
https://juejin.im/entry/5b9f0571f265da0a8f35b4bb
不可不说锁的事 --