关键字transient、volatile

以下内容整理自互联网,仅用于个人学习


transient

作用:加了该关键字的属性,不会被序列化。

换句话说,这个字段仅存于调用者内存,而不会写到磁盘里持久化。

序列化原理:将待序列化的对象中的信息写入到磁盘或网络流中。序列化中的引用会进行“深度复制”,并且如果两个对象有共同的引用对象,且两个对象都写入同一个流,那么该引用对象不会重复创建,只会创建一次,并还原到虚拟机后引用的还是同一个对象。但是,如果写入不同的流中,那么两次创建的是完全不同还原对象。

volatile

volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。

每个线程访问堆中对象时,将堆中对象load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆变量值有任何关系,而是直接修改副本变量值。
修改完之后,自动把线程变量副本的值写到对象在堆变量中。这样堆中对象的值就产生了变化。这些操作不是原子性的。

使用volatile修饰变量,JVM只是保证从内存加载到线程工作内存中的值是最新的。因此,即使使volatile还是会存在并发情况。

当且仅当满足以下所有条件时,才应该使用volatile变量:

  • 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
  • 该变量没有包含在具有其他变量的不变式中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,444评论 11 349
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,124评论 0 11
  • 今天要穿25的裤子了,希望不会丢脸。
    茄子就是茄子阅读 393评论 0 0
  • 心在哪,收获就在哪 黄传修 今天继续到双月湖晨练,自从搬家到这里,这个习惯已经十几年了。有人说:“那些锻炼的人都是...
    黄传修阅读 4,097评论 4 1
  • 长。 志昂。 小碧墙。 语露向往。 竞渡仕气场。 江山烟树痴狂。 孰复如话凤求凰? 弦管笙琶吹彻晓。 流年烟波浩渺...
    锦兮公子阅读 1,592评论 0 1