关键字
1.请你讲讲Java里面的final关键字是怎么用的?
答:分为修饰变量、方法、类进行分析
- final修饰成员变量时:一定要初始化赋值(饿汉模式)而且初始化之后不能更改(引用也一样,初始化之后不能指向其他对象)
- final修饰方法时:该方法不能被重写
- final修饰类时,该类不能被继承(String)final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
2.请你谈谈关于Synchronized和lock
答:Synchronized
- 方法上加Synchronized关键字就可以变成同步方法能够保证在同一时刻最多只有一个线程执行该段代码。
- 代码块上加Synchronized关键字就可以变成同步代码块能够保证在同一时刻最多只有一个线程执行该段代码。
相比较而言:
- Lock是一个接口,而Synchronized是一个关键字;
- synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
- Lock可以让等待锁的线程响应中断tryLock方法,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
- 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
- Lock适合锁大量的代码块,Synchronized适合锁少量的代码块。
3.请你介绍一下volatile?
答:我印象中这个关键字会用在单例模式的双重锁在给对象初始化的时候(当然那里采用的是延时加载)
-
volatile关键字是用来保证有序性和可见性的。
-
**有序性:**这跟Java内存模型有关。比如我们所写的代码,不一定是按照我们自己书写的顺序来执行的,编译器会做重排序,CPU也会做重排序的,这样的重排序是为了减少流水线的阻塞的,引起流水阻塞,比如数据相关性,提高CPU的执行效率。
4.请你介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?
答:如果修饰的是静态方法以及同步代码块那么锁住的应该是这个类的字节码文件,因为静态方法优先于对象加载;如果修饰的是成员方法,那么锁住的对象应该是调用这个方法的实例化对象。