Java教程

Java常见面试题(第二弹)

本文主要是介绍Java常见面试题(第二弹),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

欢迎关注我的技术公众号:小谢backup

1、sleep() 和 wait() 有什么区别?

类的不同:sleep() 来自 Thread,wait() 来自 Object。
释放锁:sleep() 不释放锁;wait() 释放锁。
用法不同:sleep() 时间到会自动恢复;wait() 可以使用 notify()/notifyAll()直接唤醒。

 

2、线程的 run() 和 start() 有什么区别?

start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。
run() 可以重复调用,而 start() 只能调用一次。

 

3、线程池中 submit() 和 execute() 方法有什么区别?

execute():只能执行 Runnable 类型的任务。

submit():可以执行 Runnable 和 Callable 类型的任务。

Callable 类型的任务可以获取执行的返回值,而 Runnable 执行无返回值。


4、在 Java 程序中怎么保证多线程的运行安全?

方法一:使用安全类,比如 Java. util. concurrent 下的类。

方法二:使用自动锁 synchronized。

方法三:使用手动锁 Lock。


5、怎么防止死锁?

  1. 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
  2. 尽量使用 Java. util. concurrent 并发类代替自己手写锁。
  3. 尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。
  4. 尽量减少同步的代码块。

 

6、synchronized 和 volatile 的区别是什么?

volatile 是变量修饰符;synchronized 是修饰类、方法、代码段。

volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。

volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

 

7、动态代理是什么?有哪些应用?

动态代理是运行时动态生成代理类。

动态代理的应用有 spring aop、hibernate 数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。

 

8、怎么实现动态代理?

JDK 原生动态代理和 cglib 动态代理。

JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。


9、深拷贝和浅拷贝区别是什么?

浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。


10、如何实现对象克隆?

1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法。

2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

这篇关于Java常见面试题(第二弹)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!