不可变对象(所有属性都是final)和有效不可变对象(属性不是final,但不能更改)之间的主要区别是安全发布。

由于Java内存模型为最终字段提供了保证,因此您可以在多线程上下文中安全地发布不可变对象,而不必担心添加同步:

final字段还允许程序员无需同步即可实现线程安全的不可变对象。即使所有线程都使用数据竞争在线程之间传递对不可变对象的引用,线程安全的不可变对象也被所有线程视为不可变的。这可以提供安全保证,以防止由于错误或恶意代码而滥用不可变类。必须正确使用final字段以保证不变性。

附带说明,它还可以实现不可变性(如果由于忘记了它应该是不可变的而试图在类的将来版本中对那些字段进行突变,则将无法编译)。

澄清说明

将对象的所有字段都设为final不会使其不变-您还需要确保(i)它的状态不变(例如,如果对象包含final List,则没有任何突变操作(添加,删除... )必须在施工后完成),并且(ii)this在施工过程中不要让自己逃脱

一个有效不变的对象一旦安全发布便是线程安全的

不安全发布的示例:

class EffectivelyImmutable {

static EffectivelyImmutable unsafe;

private int i;

public EffectivelyImmutable (int i) { this.i = i; }

public int get() { return i; }

}

// in some thread

EffectivelyImmutable.unsafe = new EffectivelyImmutable(1);

//in some other thread

if (EffectivelyImmutable.unsafe != null

&& EffectivelyImmutable.unsafe.get() != 1)

System.out.println("What???");

该程序理论上可以打印What???。如果i是最终决定,那将不是合法结果。

java对象的我可变属性,不可变对象的所有属性都必须是最终的吗?相关推荐

  1. python类、对象、方法、属性之类与对象笔记

    为什么80%的码农都做不了架构师?>>>    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... ...

  2. 细说JavaScript对象(1):对象的使用和属性

    JavaScript 中的一切都可以视为对象,除了两个特例:null 和 undefined. false.toString(); // 'false' [1, 2, 3].toString(); / ...

  3. 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)

    文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...

  4. 对象、对象的属性、对象字面量、枚举对象中的属性、可变类型、变量和对象——JS对象

    目录 一.对象 二.对象的属性 三.对象字面量 四.枚举对象中的属性 五.可变类型 六.变量和对象 数据类型: 原始值:(不可变类型) 1.数值 Number 2.大整数 BigInt 3.字符串 S ...

  5. Java中的String为什么是不可变的? -- String源码分析

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  6. java 对多个元素对象的排序_java list按照元素对象的指定多个字段属性进行排序...

    ListUtils.java---功能类 package com.enable.common.utils; import java.lang.reflect.Field; import java.te ...

  7. 如何给女朋友解释为什么Java里面的String对象是不可变的?

    点击关注公众号,Java干货及时送达 String的不变性 String在Java中特别常用,相信很多人都看过他的源码,在JDK中,关于String的类声明是这样的: public final cla ...

  8. java 字符串连接_为什么 Java 要把字符串设计成不可变的

    String是Java中一个不可变的类,所以它一旦被实例化就无法被修改.不可变类的实例一旦创建,其成员变量的值就不能被修改.不可变类有很多优势.本文总结了为什么字符串被设计成不可变的.将涉及到内存.同 ...

  9. Java中的String为什么是不可变的?

    String类是不可变类,一个String对象被创建以后,包含这个对象中的字符串序列是不可改变的.与其问String为什么是不可变的,还不如问String类是如何实现其对象不可变的. 什么是不可变对象 ...

最新文章

  1. 你值得拥有:25个Linux性能监控工具
  2. 1.2 数学符号-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. SpringBoot整合Mybatis超详细流程
  4. C++模板声明与实现分开--由此想到的编译,链接原理
  5. [读书笔记] 深入探索Android热修复技术原理 (手淘技术团队)
  6. Spring工具类ToStringBuilder用法简介
  7. jQuery对象与DOM对象的区别
  8. Red Hat Linux 5.4 开启xdm远程访问
  9. J2ME J2SE J2EE
  10. 前端框架 Angular 11.0.0 正式发布,不再支持 IE 9 、10
  11. Rad Controls_Q2_2006 注册机
  12. Spring Web MVC(二)
  13. Visio2010的下载
  14. Android Theme.AppCompat 中,你应该熟悉的颜色属性
  15. gmp php study,[技术干货] USP中文翻译连载 | 产品生命周期的包装密封性检查 (1、2之3)...
  16. FFmpeg源码分析:av_seek_frame()与avformat_seek_file()
  17. PIKA trouble02 -- (error) ERR Syntax error, try CLIENT (LIST [order by [addr|idle]| KILL ip:port)
  18. vue项目中,使用mint-ui的picker实现省市区三级联动,并且编辑时选中默认值(封装成独立的组件)
  19. JS禁用页面某区域不可选中文字、及修复导致行内编辑出现某单元格不可输入的问题
  20. SpringBoot登录验证码实现

热门文章

  1. java kafka分布式_JavaWeb项目架构之Kafka分布式日志队列
  2. vue cli脚手架详解_vue-cli脚手架搭建vue项目搭建
  3. controller接收json数据_这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了
  4. linux C++获取当前文件所在路径的方法
  5. C++基础与深度解析第一章:C++初探笔记
  6. android smart home,Android smart home system based on ATmega16
  7. 生成的url无法显示_快速生成PDF文档~~
  8. vue饼图组件_vue写一个图表组件(1)----饼图
  9. leetcode刷题:2.两数之和
  10. 开发实例_5G时代导热石墨散热片的开发和应用实例