为了账号安全,请及时绑定邮箱和手机立即绑定

Java面试题:静态、最终、易变、同步、暂态和原子操作详解

理解这些关键词非常重要,因为面试官经常会问一些涉及这些关键词的小问题。

问题:
  1. static实例变量之间的区别是什么?
  2. final变量、方法和类分别有什么不同?
  3. 你什么时候会在Java中使用volatile关键字?
  4. synchronized方法和synchronized块之间的区别是什么?
  5. transientvolatile之间的区别是什么?
  6. 如果你在一个多线程环境中标记一个方法为synchronized,会发生什么?
  7. Java中的atomic操作有什么作用?
  8. 使用final修饰方法参数和局部变量会有什么影响?
  9. 能否使用volatile进行复合任务,比如检查一个值然后更新它?
  10. synchronizedReentrantLock之间的区别是什么?
  11. Java中的static块有什么作用?
  12. final类可以有构造函数吗?

你可以从下面的信息中找到所有问题的答案。

详情概览:
1. 静态的

static 关键字用于类级别的变量、方法和嵌套类。这意味着成员(变量或方法)属于类,而不是类的实例。

  • 类的所有实例共享的变量:由该类的所有实例共享。
  • 可以在不创建类的实例的情况下直接调用的方法:可以在不创建类的实例的情况下直接调用。
  • 用于初始化类的代码块:用于初始化类的代码块。

例子:

一个静态变量的例子:

在这个例子中,静态变量 countCounter 类的所有实例共享,尽管 c1c2 是不同的对象,它们都会显示相同的 count 值。

一些静态方法的例子有:

在这里,add()multiply() 是静态成员方法,你可以直接通过类名 MathUtils 调用它们,而无需实例化该类。

静态区块示例(如下):

在这个例子中,当类被加载时,静态代码块会初始化数据库连接信息。这发生在任何类的实例被创建或任何静态方法被调用之前。

2. 最终版

Java中的final关键字用于定义常量值或防止继承和重写方法。它可以应用于变量、方法和类。

  • 常量变量:一旦初始化,其值不能更改(常量)。
  • 最终方法:方法不能被子类覆盖。
  • 最终类:类不能被子类继承。
示例:
固定的变量

在这里,MAX_VALUE 变量被声明为 final,所以尝试给它赋新的值会导致编译错误。一旦初始化,它的值就不可再更改。

最终的方法

在这个例子中,Parent 类中的 display() 方法被定义为 final,这使得 Child 类不能重写它。尝试重写它将会导致编译时出现错误。

在Java中,最终类指的是不可继承的类

或者使用注脚解释:最终类(Final Classes)

在这里,ImmutableClass 被声明为 final,意味着它不能被继承。如果你尝试在其他类中继承 ImmutableClass,编译器会报错。

3. 易变的

volatile 关键字用于表示一个变量的值可能被多个线程修改。它确保 Java 内存模型从主内存中读取变量,而不是从线程的本地缓存,保证一个线程所做的更新对其他线程可见,从而确保线程间的同步。

  • 在多线程中的用法:确保所有线程都能立即反映变量的变化。

4. synchronized (同步声明,用于控制并发访问)

synchronized 关键字用来确保一次只有一个线程可以访问一个方法或一段代码。它主要用于线程间的同步,以防止并发编程中的数据不一致。

  • 同步方法:一次只能有一个线程执行这个方法。
  • 同步块:对较小代码片段的同步进行更精细的控制。
同步方法示例

当一个方法被声明为同步方法时,任何时候只有一个线程可以访问该方法的锁。如果有多个线程尝试调用这个同步方法,它们将会排队等待,一个接一个地执行该方法。

在这个例子中,方法 increment() 被同步了,确保同一时间只有一个线程能执行这个方法。如果不进行同步,线程之间可能会互相干扰,导致结果不正确或不一致。

同步块示例(示例代码)

同步块主要用于锁定代码的特定部分,而不是整个方法,这使得提供了更细粒度的同步控制,从而当您只需要同步某些特定操作而不是整个方法时,这可以提升性能。

你可以对特定的对象同步一个代码块,这在你只想将同步范围限制在关键部分时很有用。

5. 暂时的

transient 关键字用于表示一个成员变量不需要被序列化。在序列化过程中,瞬态字段不会被包含在序列化的形式中。

  • 用法:当某些字段不需要保存时(比如密码、敏感信息或计算出的字段)很有帮助。

6. 原子

虽然“atomic”本身不是一个关键字,但在Java中,它表示作为单一、不可分割的操作单元执行的概念。这通常用于java.util.concurrent.atomic包提供的原子变量(例如AtomicIntegerAtomicLong等)中。

  • 原子操作:即无需显式同步即可确保线程安全的操作。
  • 原子型变量:即支持无锁机制的线程安全操作。

不同

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消