51.synchronized和lock有什么区别?
- synchronized可以给类,方法,代码块加锁;而lock只能给代码块加锁。
- synchronized不需要手动加锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而lock需要自己加锁和释放锁,如果使用不当没有unlock()去释放锁就会造成死锁。
- 通过lock可以知道有没有成功获取锁,而synchronized却无法办到。
52.synchronized和reentrantlook有什么区别?
synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较 大,但是在 Java 6 中对 synchronized 进行了非常多的改进。
主要区别如下:
- ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;
- ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开锁
- ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码 块等。
- volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编 译器优化。
53.什么是反射?
反射就是类在运行期间把类中成员抽取为其他类的过程。
54.什么是Java序列化?什么情况下使用序列化?
Java序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态在读取出来
以下情况需要使用Java序列化:
- 想把内存中的对象状态保存到一个文件中或者数据库中时候
- 想用嵌套字在网络上传送对象的时候
- 想通过RMI(远程方法调用)传输对象的时候
55.动态代理是什么?有哪些应用?
动态代理是运行时动态生成的代理类。
动态代理的应用有spring aop,hibernate数据查询,测试框架的后端mock,rpc,Java注解对象获取等。