Java常见面试题(二)

1sleep() 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、怎么防止死锁?

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

6synchronized 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 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。


内容来源:小谢backup

#Java#
全部评论

相关推荐

2 16 评论
分享
牛客网
牛客企业服务