Serializable、synchronized、transient、volatile的用法与介绍

在看链表的时候,看到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来修饰。



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值