首页 > 编程语言 >资深java面试题及答案整理(五)

资深java面试题及答案整理(五)

时间:2022-11-25 17:35:11浏览次数:40  
标签:面试题 调用 Java 线程 notify java 资深 方法 wait

 

8. 如果你的Serializable类包含一个不可序列化的成员,会发生什么?你是如何解决的?
任何序列化该类的尝试都会因NotSerializableException而失败,但这可以通过在 Java中 为 static 设置瞬态(trancient)变量来轻松解决。
Java 序列化是一个重要概念, 但它很少用作持久性解决方案, 开发人员大多忽略了 Java 序列化 API。根据我的经验, Java 序列化在任何 Java核心内容面试中都是一个相当重要的话题, 在几乎所有的网面试中, 我都遇到过一两个 Java 序列化问题, 我看过一次面试, 在问几个关于序列化的问题之后候选人开始感到不自在, 因为缺乏这方面的经验。 他们不知道如何在 Java 中序列化对象, 或者他们不熟悉任何 Java 示例来解释序列化, 忘记了诸如序列化在 Java 中如何工作, 什么是标记接口, 标记接口的目的是什么, 瞬态变量和可变变量之间的差异, 可序列化接口具有多少种方法, 在 Java 中,Serializable 和 Externalizable 有什么区别, 或者在引入注解之后, 为什么不用 @Serializable 注解或替换 Serializalbe 接口。


9. 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
另一个棘手的核心 Java 问题,wait 和 notify。它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上调用 wait 或 notify-get 的 Object。

大多数Java开发人员都知道对象类的 wait(),notify() 和 notifyAll()方法必须在Java中的 synchronized 方法或 synchronized 块中调用, 但是我们想过多少次, 为什么在 Java 中 wait, notify 和 notifyAll 来自 synchronized 块或方法?

最近这个问题在Java面试中被问到我的一位朋友,他思索了一下,并回答说: 如果我们不从同步上下文中调用 wait() 或 notify() 方法,我们将在 Java 中收到 IllegalMonitorStateException。

他的回答从实际效果上年是正确的,但面试官对这样的答案不会完全满意,并希望向他解释这个问题。面试结束后 他和我讨论了同样的问题,我认为他应该告诉面试官关于 Java 中 wait()和 notify()之间的竞态条件,如果我们不在同步方法或块中调用它们就可能存在。

让我们看看竞态条件如何在Java程序中发生。它也是流行的线程面试问题之一,并经常在电话和面对面的Java开发人员面试中出现。因此,如果你正在准备Java面试,那么你应该准备这样的问题,并且可以真正帮助你的一本书是《Java程序员面试公式书》的。这是一本罕见的书,涵盖了Java访谈的几乎所有重要主题,例如核心Java,多线程,IO 和 NIO 以及 Spring 和 Hibernate 等框架。你可以在这里查看。


为什么要等待来自 Java中的 synchronized 方法的 wait方法为什么必须从 Java 中的 synchronized 块或方法调用 ? 我们主要使用 wait(),notify() 或 notifyAll() 方法用于 Java 中的线程间通信。一个线程在检查条件后正在等待,例如,在经典的生产者 - 消费者问题中,如果缓冲区已满,则生产者线程等待,并且消费者线程通过使用元素在缓冲区中创建空间后通知生产者线程。调用notify()或notifyAll()方法向单个或多个线程发出一个条件已更改的通知,并且一旦通知线程离开 synchronized 块,正在等待的所有线程开始获取正在等待的对象锁定,幸运的线程在重新获取锁之后从 wait() 方法返回并继续进行。

让我们将整个操作分成几步,以查看Java中wait()和notify()方法之间的竞争条件的可能性,我们将使用Produce Consumer 线程示例更好地理解方案:

Producer 线程测试条件(缓冲区是是否完整)并确认必须等待(找到缓冲区已满)。
Consumer 线程在使用缓冲区中的元素后设置条件。
Consumer 线程调用 notify() 方法; 这是不会被听到的,因为 Producer 线程还没有等待。
Producer 线程调用 wait() 方法并进入等待状态。
因此,由于竞态条件,我们可能会丢失通知,如果我们使用缓冲区或只使用一个元素,生产线程将永远等待,你的程序将挂起。“在java同步中等待 notify 和 notifyall 现在让我们考虑如何解决这个潜在的竞态条件?这个竞态条件通过使用 Java 提供的 synchronized 关键字和锁定来解决。为了调用 wait(),notify() 或 notifyAll(), 在Java中,我们必须获得对我们调用方法的对象的锁定。由于 Java 中的 wait() 方法在等待之前释放锁定并在从 wait() 返回之前重新获取锁定方法,我们必须使用这个锁来确保检查条件(缓冲区是否已满)和设置条件(从缓冲区获取元素)是原子的,这可以通过在 Java 中使用 synchronized 方法或块来实现。

我不确定这是否是面试官实际期待的,但这个我认为至少有意义,请纠正我如果我错了,请告诉我们是否还有其他令人信服的理由调用 wait(),notify() 或 Java 中的 notifyAll() 方法。

总结一下,我们用 Java 中的 synchronized 方法或 synchronized 块调用 Java 中的 wait(),notify() 或 notifyAll() 方法来避免:

1) Java 会抛出 IllegalMonitorStateException,如果我们不调用来自同步上下文的wait(),notify()或者notifyAll()方法。
2) Javac 中 wait 和 notify 方法之间的任何潜在竞争条件。

10.你能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?
不,你不能在Java中覆盖静态方法,但在子类中声明一个完全相同的方法不是编译时错误,这称为隐藏在Java中的方法。
你不能覆盖Java中的静态方法,因为方法覆盖基于运行时的动态绑定,静态方法在编译时使用静态绑定进行绑定。虽然可以在子类中声明一个具有相同名称和方法签名的方法,看起来可以在Java中覆盖静态方法,但实际上这是方法隐藏。Java不会在运行时解析方法调用,并且根据用于调用静态方法的 Object 类型,将调用相应的方法。这意味着如果你使用父类的类型来调用静态方法,那么原始静态将从父类中调用,另一方面如果你使用子类的类型来调用静态方法,则会调用来自子类的方法。简而言之,你无法在Java中覆盖静态方法。如果你使用像Eclipse或Netbeans这样的Java IDE,它们将显示警告静态方法应该使用类名而不是使用对象来调用,因为静态方法不能在Java中重写。

标签:面试题,调用,Java,线程,notify,java,资深,方法,wait
From: https://www.cnblogs.com/biubiu111/p/16925813.html

相关文章

  • JavaScript 基础
    JavaScript使用JS的几种写法行内式的js直接写道元素的内部​​<buttontype="button"value="须弥"onclick="alert('纳西妲')"></button>​​内嵌式js引入式​​<scripts......
  • Java 注解与反射 基础
    注解与反射基础什么是注解Annotation注解Annotation的作用:不是程序本身,可以对程序做出解释。可以被其他程序(比如编译器等)读取annotation的格式:注解是以”@注释名“再代......
  • Java高效找出两个大数据量List集合中的不同元素
    本文将带你了解如何快速的找出两个相似度非常高的List集合里的不同元素。主要通过JavaAPI、List集合双层遍历比较不同、借助Map集合查找三种方式,以及他们之间的执行效率情......
  • VC++面试题
    最近公司要招聘有经验的VC++程序员,让我来技术面。我设计了一套题来问面试者。有关于VC编译的、有C++基础的、有STL、有DLL、有多线程、有Win32/MFC的、还有OOP以及实际操作......
  • java打印杨辉三角
    java打印杨辉三角方法一使用二维数组的方法:importjava.util.Scanner;publicclassYangHui1{publicstaticvoidmain(String[]args){/*杨辉三角如......
  • java ThreadLocal 内存泄露
    原文:https://zhuanlan.zhihu.com/p/56214714 前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之......
  • Starrocks提示be找不到JAVA_HOME
    解决方案:vim/etc/profile这里面添加java的环境变量source/etc/profile重启be进程......
  • Java中List同ArrayList有什么不同呢?
    转自:http://www.java265.com/JavaProblem/202110/1415.html下文笔者讲述使用java代码常见的List和ArrayList的不同之处,如下所示:不同之处:一、两者压根都不是一个......
  • Java中final的作用【杭州多测师】【杭州多测师_王sir】
    final关键字可以用来修饰引用、方法和类a.用来修饰一个引用如果引用为基本数据类型,则该引用为常量,该值无法修改;如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可......
  • Java中的spring mvc和spring boot的区别【杭州多测师】【杭州多测师_王sir】
    spring boot只是一个配置工具,整合工具,辅助工具.springmvc是框架,项目中实际运行的代码Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们......