final IN JVM AND JMM

Simply put

In JMM (Java Memory Model), the final keyword is used to ensure visibility and immutability in a multi-threaded environment. In Java, the final keyword can be used to modify variables, methods, and classes, as follows:

  1. Modifying variables: A variable that is marked as final is immutable, meaning its value cannot be changed after initialization. In a multi-threaded environment, using final variables ensures that their values are visible to all threads.

  2. Modifying methods: A method that is marked as final cannot be overridden by a subclass, meaning its behavior is fixed across the entire inheritance hierarchy.

  3. Modifying classes: A class that is marked as final cannot be subclassed, meaning its behavior is fixed across the entire inheritance hierarchy.

In JMM, using the final keyword ensures visibility and immutability in a multi-threaded environment. Specifically, when a thread initializes a final variable, other threads can immediately see the value of that variable. Additionally, because final variables are immutable, they do not require synchronization in a multi-threaded environment, which can improve performance.

JVM 说明

在JVM中,如果使用的是常量池中的字面量(例如字符串、整数等),它们会被缓存在运行时常量池中,并且常量池的地址是固定的,因此这些常量的内存地址是不会改变的。

但是,对于使用常量池中的符号引用来访问常量的情况,由于执行时需要进行解析,并根据符号引用指向的地址找到具体的常量值,因此这些常量的内存地址可能会改变。

在JMM中,由于常量池中的数据已经经过缓存,因此不需要进行同步操作即可进行读取,这对于多线程编程来说是非常有利的。JMM规定了对常量池读取操作的具体执行顺序和内存模型,保证了在多线程情况下常量池的一致性和正确性。

总之,常量池的数据在JVM中的地址是固定的,但是符号引用的解析过程可能会导致常量的内存地址发生改变。在JMM中,常量池的读取操作具有一致性和正确性,可以直接被多个线程访问。

JMM说明

在JMM中,final关键字有以下几个用途:

定义不可变类型的常量:
使用final关键字可以将一个变量定义为常量,使得它的值不能被改变,从而实现不可变类型的常量。

final关键字通常用于声明静态常量或成员常量,常量的值在编译时就确定了,因此不需要在运行时进行同步操作,保证了线程安全性。

声明不可变类型的变量:
使用final关键字可以将一个已经被初始化的变量标记为不可变类型,这个变量的值不能被重新赋值,从而有效地避免了并发修改带来的问题。

保证多线程情况下的可见性:
final关键字可以保证在多线程情况下的可见性和正确性。

当一个final变量被初始化后,它的值对所有线程都是可见的,因此在多线程环境下,读取final变量的值不需要进行同步操作。
同时,final变量的值不能被改变,因此也避免了由于并发修改导致的问题。

总之,在JMM中,final关键字用于保证常量和变量的不可变性、线程安全性和可见性,是一种非常有用的保障机制。

你可能感兴趣的:(Java,Basic,knowledge,jvm,java,开发语言)