`
wfwkiss
  • 浏览: 123728 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
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();
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics