面试-关键字

一、请你讲讲Java里面的final关键字是怎么用的?

答:①final修饰一个类时,表示这个类不能被继承。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为fianl方法。

②使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义。第二个原因就是效率。在早期的Java实现版本中,会将fianl方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。

②final修饰一个变量。如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

二、请你谈谈关于Synchronized和lock?

答:synchronized是Java关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

Lack是一个接口,而synchronized是java关键字,synchronized是内置的语言实现;synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象的发生;而Lock在发生异常时,如果没有主动通、过unlock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

三、请你介绍一下volatile?

答:volatile关键字是用来保证有序性和可见性的。这跟java内存模型有关。比如我们所写的代码,不一定是按照我们书写的顺序来执行的,编译器会做重排序,CPU会做重排序,这样的重排序是为了减少流水线的阻塞的,引起流水阻塞,比如数据相关性,提高CPU的执行效率。需要有一定的顺序和规则来保证,不然程序员自己写的代码都不知道对不对了,所以有happens-before规则,其中有条就是volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;有序性实现的是通过插入内存屏障来保证的。可见性:首先java内存模型分为,主内存,工作内存。比如线程A从主内存把变量从主内存读到了自己的工作内存中,做了加1的操作,但是此时没有将i的最新值刷新回主内存中,线程B此时读到的还是i的旧值。加了volatile关键字的代码生成的汇编代码发现,会多一个lock前缀指令。Lock指令对intel平台的cpu,后面提出了缓存一致性协议,MESI,来保证了多核之间数据不一致性问题。

四、请你介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?

答:synchronized修饰静态方法以及同步代码块的synchronized用法锁住的是类,线程想要执行对应同步代码,需要获得类锁。

synchronized修饰成员方法,线程获取的是当前调用该方法的对象实例的对象锁。

发布了17 篇原创文章 · 获赞 26 · 访问量 7432

猜你喜欢

转载自blog.csdn.net/qq_41629684/article/details/104068967