1.随便整理---synchronized

  重量级锁,和ReentrantLock一样都是可重入锁,并且也是独占锁。两者的区分就是synchronized可能会出现饥饿锁的情况,而ReentrantLock可以通过参数的传入实现公平锁,也可以自行中断锁。
  说到重量级锁,就可以延伸到自旋锁,偏向锁,轻量级锁,重量级锁的感念。目前synchronized在使用的过程中,初始是偏向锁,如果多个线程都获取锁,可以膨胀升级为轻量级锁,如果线程争夺锁很激烈的话,会自动升级为最原始的重量级锁。
自旋锁其实就相当于java的while循环,如果你一直循环的话,对cpu的消耗一定是很大的,所以锁会自动升级,偏向锁和轻量级锁都运用到了自旋锁的概念。用自旋锁是因为在重量级锁的情况下,线程会有阻塞的情况,每次唤醒线程需要在内核态和用户态之间做切换,这个开销也是浪费时间的,所以并发量小的情况下,可以用自旋锁将线程挂起,类似于地铁进站,刷卡等一会就行了。高并发的情况下,重量级锁的性能就远大于自旋锁了。
  可重入锁的实现原理是每个对象都有一个监视器锁–monitor,通过进入锁+1,释放锁-1来实现。
  对于jvm启动而言,定义的synchronized方法不会再第一时间加载,采用的是延迟加载的方式,避免占用资源。启动4秒前,方法是无锁的状态,4s后才会变成偏向锁。如果4s内有人调用的话,会自动膨胀会轻量级锁。
  synchronized最经典的用法就是单例模式,手写个单例:

public class Singel{
	private volatile static final single;
	private Singel(){}
	public static Singel getSingel(){
		if(null==single){
			synchronized(Singel.class){
			if (null==single) {
					single= new Singel();
			}
		}
	}
	return single;
}

你可能感兴趣的:(经典面试整理)