在看链表的时候,看到transient关键词:
然后就去百度了一下,发现相关的有四个,这边通过个人的理解,简单概括了一下。
Serializable:
序列化(串行化),反序列化(并行化)
在java中得数据要被序列化成字节流,才嫩和在磁盘io和网络io中传输,需要继承Serializable接口。
Serializable接口类似于一个声明,没有具体的方法,只是表明使用了序列化协议。
transient:
1、对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的。例如一个Thread对象或一个FileInputStream对象
对于这些字段,我们必须用transient关键字标明,否则编译器将报措。
2、安全性,transient可以防止被序列化的数据,反序列化得到原始的数据。比如要保证密码的安全性,密码在序列化之后,若被
transient修饰,反序列化的结果为空。
3、transient只能修饰变量,不能修饰方法和类。
验证代码:
/**
* 变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
*/
public class LoggingInfo implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private String uid;
private transient String pwd;
LoggingInfo(String user, String password) {
uid = user;
pwd = password;
}
public String toString() {
String password = null;
if (pwd == null) {
password = "NOT SET";
} else {
password = pwd;
}
return "logon info: \n " +
"user: " + uid +
"\n password: " + password;
}
public static void main(String[] args) {
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
"logInfo.out"));
o.writeObject(logInfo);
o.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"logInfo.out"));
LoggingInfo logInfo1 = (LoggingInfo) in.readObject();
System.out.println(logInfo1.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
序列化ID:
如果A端和B端都有一个类文件,功能代码都相同,也都继承了serializable,如果序列化ID不同,他们就无法相互序列化和反序列化。
一般使用默认值的为1L:
private staticfinal long serialVersionUID = 1L
volatile:
首先synchronized的意思是:在同一时刻只能有一个被synchronized修饰的方法或者代码块。
在java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保
持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,
或者main memory中的值不一致的情况。
用volatile修饰的变量,在每次的使用之前,都会从(主)内存中更新一遍最新的值(主内存一般存放变量最新的值)。
那么volatile和synchronized有什么区别呢?
volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然
synchronized要比volatile消耗更多资源。
那么为什么有了volatile还要synchronized呢?
因为声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用。如:n++、n=n+1等
这个时候只能用synchronized来修饰了。
所以使用volatile的时候 一定要谨慎,没有把握的时候 还是应该用synchronized来修饰。