最近看到一个面试题,包括我自己也经常遇到面试官问Synchronized关键字的用法和底层原理。今天就来总结一下相关的问题和答案。
1、Synchronized关键字的作用
我想但凡用Java的开发者肯定都知道这个关键字,它是JDK提供给大家使用的同步关键字,用于在多线程场景下对关键资源的加锁,以保障数据不会因为多线程而紊乱。包括在Java很多内置的函数里面也都是使用的该关键字,比如JDK1.5里面的HashMap就是靠Synchronized关键字修饰的类方法来实现的线程安全。
2、Synchronized的用法
Synchronized主要有三种用法,分别是:修饰方法、修饰代码块、修饰静态方法。
2.1修饰对象方法,主要是将这个对象方法进行加锁,这样其他现场在调用这个对象时就无法访问了,但是该对象的其他方法仍然是可以被其他线程访问获取的。
2.2修饰代码块,常常以Synchronized(this){代码块;}这种方式出现在代码证,这种情况下这一整块代码就可以被视作是一个整体,只能同时被一个线程所持有锁,进行资源访问,而其他线程只能被阻塞等待。
2.3修饰静态方法,修饰静态变量也十分好理解,例如public static void synchronized get(int s){} ;这种情况下这个类方法的调用者,都会被锁控制。
3、Synchronized底层的实现机制
该关键字的底层其实是依靠Monitor管程对象来实现的,一旦该对象或者方法被加了关键字,那么在底层就会有