第三章 对象的共享

可见性

  失效数据

  非原子的64位操作:非volatile类型的64位数值变量(double和long).java内存模型要求,变量的读取和写入操作必须是原子。对于非volatile类型的long和double变量,JVM允许将64位的读写操作分解成两个32位操作

  加锁与可见性

  Volatile变量:只能保证可见性,原子性不能

发布与逸出

  发布:一个对象能够在当前作用域之外的代码使用

  逸出:某个对象不应该发布的时候被发布出去,不要在构造过程中使thsi引用逸出

线程封闭

  当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式就是不共享数据。仅在单线程内访问数据,就不需要同步

  Ad-hoc线程封闭

  栈封闭

  Threadlocal类

不变性

  不可变对象一定是线程安全的

  满足以下条件对象才是不可变的:

    对象创建以后其状态就不能修改

    对象所有域都是final类型

    对象是正确创建的(在对象创建期间,this引用没有逸出)

安全发布

  在静态初始化函数中初始化一个对象引用

  将对象的引用保存到volatile类型的域或者AtomicReferance对象中

  将对象的引用保存到某个正确构造对象的final类型域中

  将对象的引用保存到一个由锁保护的域中

posted on   胡子就不刮  阅读(108)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· 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 让容器管理更轻松!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示