第三章 对象的共享
可见性
失效数据
非原子的64位操作:非volatile类型的64位数值变量(double和long).java内存模型要求,变量的读取和写入操作必须是原子。对于非volatile类型的long和double变量,JVM允许将64位的读写操作分解成两个32位操作
加锁与可见性
Volatile变量:只能保证可见性,原子性不能
发布与逸出
发布:一个对象能够在当前作用域之外的代码使用
逸出:某个对象不应该发布的时候被发布出去,不要在构造过程中使thsi引用逸出
线程封闭
当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式就是不共享数据。仅在单线程内访问数据,就不需要同步
Ad-hoc线程封闭
栈封闭
Threadlocal类
不变性
不可变对象一定是线程安全的
满足以下条件对象才是不可变的:
对象创建以后其状态就不能修改
对象所有域都是final类型
对象是正确创建的(在对象创建期间,this引用没有逸出)
安全发布
在静态初始化函数中初始化一个对象引用
将对象的引用保存到volatile类型的域或者AtomicReferance对象中
将对象的引用保存到某个正确构造对象的final类型域中
将对象的引用保存到一个由锁保护的域中
不积跬步,无以至千里;不积小流,无以成江海
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!