A:在代码中使用transient声明一个实例变量,并把对象序列化的时候不会被存储的
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Person implements Serializable {
//在代码中使用transient声明一个实例变量,并把对象序列化的时候不会被存储的,例如:
private String username;
private transient int age;
Person(String name, int age) {
this.username = name;
this.age = age;
}
public String toString() {
return "username: " + username + "\nage: " + age;
}
public static void main(String[] args) {
Person person = new Person("Hulk", 12);
System.out.println("save object before****************************");
System.out.println(person);
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.txt"));
out.writeObject(person);
out.close();
Thread.sleep(2000);
ObjectInputStream input = new ObjectInputStream(new FileInputStream("person.txt"));
System.out.println("read object***********************************");
person = (Person) input.readObject();
System.out.println(person);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序,成员变量boolValue用volatile修饰会导致程序很快退出:
package linyumin.test.thread;
/**
*
* @author llade
*
*/
public class VolatileObjectTest {
/**
* 成员变量boolValue使用volatile和不使用volatile会有明显区别的。
* 本程序需要多试几次,就能知道两者之间的区别的。
* @param args
*/
public static void main(String[] args) {
final VolatileObjectTest volObj=new VolatileObjectTest();
Thread t1=new Thread(){
public void run(){
System.out.println("t1 start");
for(;;){
volObj.waitToExit();
}
}
};
t1.start();
Thread t2=new Thread(){
public void run(){
System.out.println("t2 start");
for(;;){
volObj.swap();
}
}
};
t2.start();
}
boolean boolValue;//加上volatile 修饰的是时候,程序会很快退出,因为volatile 保证各个线程工作内存的变量值和主存一致。所以boolValue == !boolValue就成为了可能。
public void waitToExit() {
if(boolValue == !boolValue)System.exit(0);//非原子操作,理论上应该很快会被打断。实际不是,因为此时的boolValue在线程自己内部的工作内存的拷贝,因为它不会强制和主存区域同步,线程2修改了boolValue很少有机会传递到线程一的工作内存中。所以照成了假的“原子现象”。
}
public void swap() {//不断反复修改boolValue,以期打断线程t1.
boolValue = !boolValue;
}
}
int 的问题初始化和默认
public class MyField{
int i = 99;
void amethod(){
int i=0;
int[] j = new int[5];
System.out.println(i);
System.out.println(j[0]);
}
public static void main(String argv[]){
MyField m = new MyField();
m.amethod();
}
}
分享到:
相关推荐
Java中的transient关键字
关于Java中关键字transient和串行化的简略介绍
JAVA中transient关键字的讲解
java关键字transient
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,
主要介绍了java中transient关键字用法,以实例形式分析了java中transient关键字的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
NULL 博文链接:https://jackyz548.iteye.com/blog/1662257
AQS是一个通过内置的 FIFO 双向队列来完成线程的排队工作(内部通过结点head和tail记录队首和队尾元素,元素的结点类型为Node类型,后面我们会看到Node的具体构造)。 /*等待队列的队首结点(懒加载,这里体现为竞争...
主要介绍了Java transient关键字与序列化操作,结合实例形式详细分析了java序列化操作相关实现方法与操作注意事项,需要的朋友可以参考下
深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)
创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...
控制序列化IO的类 import java.io.*; public class PersonMapper { private PersonMapper() {} private static PersonMapper mapper; /** * 获取单例 * @return 单例 */ public static PersonMapper ...
主要介绍了Java中的transient关键字介绍,需要的朋友可以参考下
本篇文章序列化、反序列化用的类是同一个类,可以通过注释main中1然后修改Stu类实现有无transient关键字修饰、serialVersionUID是否不同,得到以下结果: 1、serialVersionUID的数值大小不会影响序列化后的字节数...
通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...
这个对象可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。 然而在实际开发过程中,...
(3)按顺序分别调用类成员变量和实例成员变量的初始化表达式; (4)调用本身构造函数。" Q0053 "Public class Servlet extends HttpServlet{ int i; doget(){ i++; out.print(i); } } 每次访问时i是否变化?...
本文章向大家介绍Java transient关键字的使用方法和实例,包括的知识点有transient的作用、transient使用小结、transient使用细节,需要的朋友可以参考一下
native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...