理解这些关键词非常重要,因为面试官经常会问一些涉及这些关键词的小问题。
问题:static
和实例变量
之间的区别是什么?final
变量、方法和类分别有什么不同?- 你什么时候会在Java中使用
volatile
关键字? synchronized
方法和synchronized
块之间的区别是什么?transient
和volatile
之间的区别是什么?- 如果你在一个多线程环境中标记一个方法为
synchronized
,会发生什么? - Java中的
atomic
操作有什么作用? - 使用
final
修饰方法参数和局部变量会有什么影响? - 能否使用
volatile
进行复合任务,比如检查一个值然后更新它? synchronized
和ReentrantLock
之间的区别是什么?- Java中的
static
块有什么作用? final
类可以有构造函数吗?
你可以从下面的信息中找到所有问题的答案。
详情概览:1. 静态的
static
关键字用于类级别的变量、方法和嵌套类。这意味着成员(变量或方法)属于类,而不是类的实例。
- 类的所有实例共享的变量:由该类的所有实例共享。
- 可以在不创建类的实例的情况下直接调用的方法:可以在不创建类的实例的情况下直接调用。
- 用于初始化类的代码块:用于初始化类的代码块。
例子:
一个静态变量的例子:
在这个例子中,静态变量 count
由 Counter
类的所有实例共享,尽管 c1
和 c2
是不同的对象,它们都会显示相同的 count
值。
一些静态方法的例子有:
在这里,add()
和 multiply()
是静态成员方法,你可以直接通过类名 MathUtils
调用它们,而无需实例化该类。
在这个例子中,当类被加载时,静态代码块会初始化数据库连接信息。这发生在任何类的实例被创建或任何静态方法被调用之前。
2.最终版
Java中的final
关键字用于定义常量值或防止继承和重写方法。它可以应用于变量、方法和类。
- 常量变量:一旦初始化,其值不能更改(常量)。
- 最终方法:方法不能被子类覆盖。
- 最终类:类不能被子类继承。
在这里,MAX_VALUE
变量被声明为 final
,所以尝试给它赋新的值会导致编译错误。一旦初始化,它的值就不可再更改。
在这个例子中,Parent
类中的 display()
方法被定义为 final
,这使得 Child
类不能重写它。尝试重写它将会导致编译时出现错误。
或者使用注脚解释:最终类(Final Classes)
在这里,ImmutableClass
被声明为 final
,意味着它不能被继承。如果你尝试在其他类中继承 ImmutableClass
,编译器会报错。
volatile
关键字用于表示一个变量的值可能被多个线程修改。它确保 Java 内存模型从主内存中读取变量,而不是从线程的本地缓存,保证一个线程所做的更新对其他线程可见,从而确保线程间的同步。
- 在多线程中的用法:确保所有线程都能立即反映变量的变化。
synchronized (同步声明,用于控制并发访问)
synchronized
关键字用来确保一次只有一个线程可以访问一个方法或一段代码。它主要用于线程间的同步,以防止并发编程中的数据不一致。
- 同步方法:一次只能有一个线程执行这个方法。
- 同步块:对较小代码片段的同步进行更精细的控制。
当一个方法被声明为同步方法时,任何时候只有一个线程可以访问该方法的锁。如果有多个线程尝试调用这个同步方法,它们将会排队等待,一个接一个地执行该方法。
在这个例子中,方法 increment()
被同步了,确保同一时间只有一个线程能执行这个方法。如果不进行同步,线程之间可能会互相干扰,导致结果不正确或不一致。
同步块主要用于锁定代码的特定部分,而不是整个方法,这使得提供了更细粒度的同步控制,从而当您只需要同步某些特定操作而不是整个方法时,这可以提升性能。
你可以对特定的对象同步一个代码块,这在你只想将同步范围限制在关键部分时很有用。
5. 暂时的transient
关键字用于表示一个成员变量不需要被序列化。在序列化过程中,瞬态字段不会被包含在序列化的形式中。
- 用法:当某些字段不需要保存时(比如密码、敏感信息或计算出的字段)很有帮助。
原子
虽然“atomic”本身不是一个关键字,但在Java中,它表示作为单一、不可分割的操作单元执行的概念。这通常用于java.util.concurrent.atomic
包提供的原子变量(例如AtomicInteger
,AtomicLong
等)中。
- 原子操作:即无需显式同步即可确保线程安全的操作。
- 原子型变量:即支持无锁机制的线程安全操作。
共同学习,写下你的评论
评论加载中...
作者其他优质文章