native
用该关键字修饰的方法是通过JNI调用的可以直接操作硬件的方法,其实就是不是用java写的方法。
transient
该关键字用在修饰成员变量上,指定该成员变量在序列化是不进行序列化。示例如下:
2.1 User Class编码如下:
public class User implements Serializable {
private static final long serialVersionUID = 760589721523919512L;
private String name;
private transient String password;
}
2.2 MainHandler Class编码如下:
public class MainHandler {
public static void main(String[] args) throws IOException, ClassNotFoundException {
User user1 = new User();
user1.setName("David");
user1.setPassword("123456qwe");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(user1);
byte[] bytes = bos.toByteArray();
bos.close();
oos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
Object o = ois.readObject();
User user2 = (User) o;
bis.close();
ois.close();
System.out.println(user2);
}
}
2.3 执行结果如下:
User{name='David', password='null'}
volatile
该关键字用来修饰变量,是保证变量的并发安全的。使用时一般需要结合synchronized一起使用。
volatile可以保证在CPU计算时,变量是从内存中读取而不是在CPU自带的缓存中读取。变更也同样是直接变更内存中的数据,而不是CPU缓存中的数据。
为了提高计算速度,CPU会将数据放到自带的缓存中。所以当出现多核处理器,有多个CPU就可能出现处理多线程数据在不同的CPU上,同一份数据在不同的CPU处理时数据变动并没有通知其他导致数据不安全。