Java中的transient,volatile,int初始化和默认值

[b][color=red]A:在代码中使用transient声明一个实例变量,并把对象序列化的时候不会被存储的[/color][/b]

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();
}
}
}


[color=red][b]使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。以下是示例程序,成员变量boolValue用volatile修饰会导致程序很快退出: [/b][/color]


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;
}

}


[color=red][b]int 的问题初始化和默认[/b][/color]

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();
}
}

你可能感兴趣的:(杂乱)