Java 中易失性关键字和瞬态关键字的区别
原文:https://www . geesforgeks . org/volatile-and-transient-keywords-in-Java/之间的区别
就像任何其他编程语言一样, Java 有一组关键字,它们是保留的,有特殊的含义。在本文中,我们将看到关键词 volatile 和 transient 之间的区别。
在讨论这些差异之前,让我们先了解它们各自的真正含义。
波动 :
Volatile 关键字用于标记 JVM 和线程从主内存中读取其值,而不使用线程堆栈中存在的缓存值。它在 java 并发编程中使用。
Java 语言(一种计算机语言,尤用于创建网站)
class GFG extends Thread {
// using volatile
volatile boolean working = true;
// if non-volatile it will
// sleep in main and
// runtime error will coocur
public void run()
{
long count = 0;
while (working) {
count++;
}
System.out.println("Thread terminated."
+ count);
}
// Driver code
public static void main(String[] args)
throws InterruptedException
{
GFG test = new GFG();
test.start();
Thread.sleep(100);
System.out.println("After Sleeping in Main");
test.working = false;
test.join();
System.out.println("Working set to "
+ test.working);
}
}
输出:
易失性代码输出
瞬变 :
瞬态关键字与实例变量一起使用,以将其从序列化过程中消除。在序列化过程中,不保存瞬态字段或变量的值。
Java 语言(一种计算机语言,尤用于创建网站)
import java.io.*;
class Test implements Serializable {
// Making Accesskey transient for security
transient String accessKey;
// Making age transient as age can be
// calculated from Date of Birth
// and current date.
transient int age;
// serialize other fields
String name, address;
public Test(String accessKey, int age,
String name, String address)
{
this.accessKey = accessKey;
this.age = age;
this.name = name;
this.address = address;
}
}
public class GFG {
public static void main(String[] args)
throws Exception
{
ObjectInputStream in
= new ObjectInputStream(
(new FileInputStream(
"login_details.txt")));
Test obj = (Test)in.readObject();
/* Transient variable will be shown
null due to security reasons.*/
System.out.println("Accesskey: "
+ obj.accessKey);
System.out.println("Age: "
+ obj.age);
System.out.println("Name: "
+ obj.name);
System.out.println("Address: "
+ obj.address);
}
}
输出:
瞬态代码输出
下表描述了差异:
| 短暂的 | 不稳定的 | | --- | --- | | 瞬态标记变量阻止它被序列化。 | 在多线程 java 程序中,Volatile 标记的变量在可见性上遵循先发生后发生的关系,这降低了内存一致性错误的风险。 | | 它为从序列化过程中排除一些对象方法提供了控制和灵活性。 | 它防止 JVM 进行可能危及同步的重新排序。 | | 在反序列化过程中,它们用默认值初始化。 | 它们没有用默认值初始化。 | | 它不能与 static 关键字一起使用,因为静态变量不属于单个实例。在序列化期间,只关心对象的当前状态。 | 它可以与 static 关键字一起使用。 | | 它不能与 final 关键字一起使用。虽然 JVM 没有抱怨,但是在反序列化期间,人们将面临重新初始化变量的问题。 | 它可以和 final 关键字一起使用。 |版权属于:月萌API www.moonapi.com,转载请注明出处