`
wfwkiss
  • 浏览: 127077 次
  • 性别: 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();
	}
}
分享到:
评论

相关推荐

    Java语言基础.pdf

    首先,Java中的标识符是用于给变量、方法和类命名的重要元素。标识符的规则非常明确:它们可以包含字母、数字、下划线或美元符号,但首字符不能是数字。Java支持Unicode字符集,这意味着它可以处理包括汉字在内的...

    java语言笔记包括基本数据类型、变量类型、修饰符、运算符等

    - **初始化**: 不强制要求初始化,但建议在创建对象时或之后立即初始化。 ##### 3. 静态变量 - **定义**: 使用`static`关键字声明。 - **作用域**: 在整个类中可见。 - **生命周期**: 类加载时创建,类卸载时销毁...

    很好的JAVA课堂笔记

    - **final变量**:对于声明为`final`的变量,一旦初始化就不能再次修改其值。 - **transient关键字**:用于标记对象中的瞬态状态,这些状态在序列化时会被忽略。 - **volatile关键字**:用于确保多个线程之间的可见...

    Java语法大全史上最全语法

    - `transient`: 用于序列化。 - `try`: 用于捕获异常。 - `void`: 用于声明无返回值的方法。 - `volatile`: 用于多线程环境中变量的可见性。 - `while`: 用于创建while循环。 ### 示例代码解析 下面是一个简单的...

    Java scjp考试试题

    由于 `s` 未被显式初始化,默认值为 `null`,因此当尝试打印 `s` 时,将会抛出 `NullPointerException`。正确答案是 **C. 代码不编译,因为 `s` 未初始化**。 #### 题目91: 字符类型声明 **题目描述:** 题目要求...

    java资料面试题

    Java 中的关键字包括但不限于:abstract、assert、boolean、break、byte、case、catch、char、class、const、continue、default、do、double、else、enum、extends、final、finally、float、for、if、goto、...

    java入门 练习题题库

    - **知识点**: Java中的基本数据类型声明及初始化。 - **解析**: - `long l = 0xfffL;` 是正确的声明方式。 - 选项分析: - A. `byte = 128;`: 错误,`byte`的最大值为127。 - B. `Boolean = null;`: 错误,`...

    Java计算机核心编程笔记

    - `const`:常量修饰符(Java中未使用)。 #### 七、变量命名与作用域 - **变量命名规则**: - 类名首字母大写,多个单词组合时,每个单词首字母大写(大驼峰命名法)。 - 小驼峰命名法:首个单词字母小写,后面...

    java面试必会200题.docx

    - Java中使用`java.util.regex`包来实现正则表达式的匹配。 31. **什么是懒加载(LazyLoading)** - 懒加载是一种优化技术,在真正需要数据之前不加载数据,从而减少不必要的开销。 32. **什么是尾递归,为什么...

    整理后java开发全套达内学习笔记(含练习)

    initialize 预置 初始化 [i'niʃәlaiz] instanceof (关键字) 运算符,用于引用变量,以检查这个对象是否是某种类型。返回 boolean 值。 interface (关键字) 接口 ['intәfeis] invoke vt.调用 [in'vәuk]' ( ...

    java经典面试2010集锦100题(不看你后悔)

    C) 程序能通过编译,运行时将打印出0/0,因为在Java中int型变量day和month默认为0。 D) 以上说法都不正确。 题目10:c 下面关于继承的描述正确的一项是:(选择1项) A) 子类继承父类,那么子类将继承父类的所有...

    2010年新版java综合面试题

    Java中的关键字 这部分似乎没有给出具体的关键字列表,但通常面试中会涉及如下关键字: - **`class`**, **`interface`**, **`enum`**:用于定义类、接口和枚举。 - **`abstract`**:用于声明抽象类或抽象方法。 - ...

    【05-面向对象(下)】

    •对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。 •对于实例属性,要么在普通初始化块中指定初始值。要么在定义时、或构造器中指定初始值。 final修饰局部变量 •使用final修饰...

Global site tag (gtag.js) - Google Analytics