`

Java并发笔记之------对象共享

    博客分类:
  • JAVA
 
阅读更多

可见性
在不同线程对同一个对象的读写操作时,线程的可见性显得尤为的重要,为了确保多个线程之间对内存的写入操作的可见性,必须使用同步机制,因为我们没法确保执行读操作的线程能实时的读取到写操作线程刚刚写入的值。

同步机制:
Java并发笔记之——对象的共享


对于上图的同步机制,可以使用volatile关键字来修饰对象实现,但并不推荐,因为它不能完全的保证对象的线程安全,他是java语言提供的一种轻量的、稍弱的同步机制;volatile变量对可见性的影响比volatile变量本身更加重要。当线程A首先写入一个volatile变量并且线程B随后读取该变量时,在写入volatile变量之前对A可见的所有变量的值,在B读取了volatile变量之后,对B也是可见的。因此,从内存的角度来说,写入volatile变量相当与退出了同步代码块,而读取volatile变量的值相当与进入了同步代码块。然后,我们并不建议过度依赖volatile变量提供的可见性。如果在代码里通过volatile变量来控制状态的可见性,通常比使用锁更加的脆弱,也更加难以理解!

对象的发布和溢出
发布:使对象能在当前作用域之外的代码处使用;
溢出:对某个不应发布的对象进行发布的时候,就称溢出;
溢出会破坏程序的封装性,导致程序变的难以维护,一个非线程安全的内部对象溢出后,会破坏线程的安全,导致意想不到的后果!

Java并发笔记之——对象的共享

如上图这样发布一个数组,任何调用者都可以修改这个数组的内容,在这里,数组states已经逾越了它的作用范围了,因为这个本应该是私有的变量被发布了。

最后一个发布要注意的是,不要在构造中,通过内部类的方式,隐式的发布一个this引用!
Java并发笔记之——对象的共享

上面例子中,注册监听的时候,创建了一个匿名内部类,在这个匿名内部类中,隐式的包含了ThisEscape的this引用,使得在这个匿名内部类中可以访问和修改ThisEscape的作用域。可以通过工厂模式来解决这个问题:
Java并发笔记之——对象的共享


线程封闭
线程封闭是指将一些共享的对象,基于安全考虑,感觉全部封闭在线程内,不让其他线程访问,通过避免使用同步技术来达到不共享数据的方式;比较合理的封闭有两种,一种是栈封闭,还有一种是JDK提供的更加规范的方式,使用ThreadLocal类来完成;

栈封闭:
栈封闭是线程封闭的一种特例,在栈封闭中,只有通过局部变量才能访问对象。

分享到:
评论

相关推荐

    《java并发编程实战》读书笔记-第3章-对象的共享

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容

    Java并发编程实战-读书笔记

    《Java并发编程实战》个人读书笔记,非常详细: 1 简介 2 线程安全性 3 对象的共享 4 对象的组合 5 基础构建模块 6 任务执行 7 取消与关闭 8 线程池的使用 9 图形用户界面应用程序 10 避免活跃性危险 11 性能与可...

    JAVA并发编程实践-线程对象与组合对象-学习笔记

    使用java.util.concurrent类库构造安全的并发应用程序的基础。共享其实就是某一线程的数据改变对其它线程可见,否则就会出现脏数据。

    《java并发编程实战》读书笔记-第4章-对象的组合

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括线程安全类设计、实例封闭、线程安全性委托、现有线程安全类中添加功能和文档化同步策略等内容

    JAVA并发编程实践-线程安全-学习笔记

    线程安全就是对共享的、可变的状态进行管理,对象的状态就是它的数据,换句话说就是在不可控制的并发访问中保护数据。

    《java并发编程实战》读书笔记-第5章-基础构建模块

    《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括同步容器类、并发容器类、阻塞队列和生产者消费者模式、阻塞和中断方法、同步工具类。最后是构建高效且可伸缩的结果缓存

    java学习笔记 初学者必读

    14.5. 共享数据的并发处理 14-44 14.6. 使用互斥锁的注意事项 14-44 15. 十四•标准I/O流与文件 15-46 15.1. 对文件的操作 15-46 15.2. 处理跨平台性 15-46 15.3. 对象的序列化接口 15-47 15.4. I/O流基础 15-47 ...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    Java并发编程的艺术.md

    《Java并发编程的艺术》笔记 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 volatile的两条实现原则: 1. Lock前缀指令会引起处理器缓存回写到内存 2. 一个处理器的缓存回写到内存会导致其他...

    notes-learning-java-concurrency:java 并发学习笔记

    Java并发编程学习笔记 这是我两年前(2012-05)的学习笔记。。 -- 本文不会详细介绍java5以前的多线程开发的知识,而是重点介绍java5以来多线程开发的一些新变化。部分文字、代码都是摘抄、提炼过来的,大家有兴趣可...

    并发编程笔记20190526.docx

    第一章 线程基础、线程之间的共享和协作 3 一、基础概念 3 1. 什么是进程和线程 3 2. CPU核心数和线程数的关系 3 3. 澄清并行和并发 5 4. 多线程程序需要注意事项 6 二、认识Java里的线程 7 1. Java程序天生就是多...

    java并发学习笔记

    文章目录1 线程基础、线程之间的共享与协作1.1 cpu时间片轮询机制1.2 进程与线程1.3 并行与并发1.4 启动线程的三种方式1.5 停止线程1.6 线程的生命周期1.7 守护线程1.8 synchronized关键字1.9 volatile关键字1.10 ...

    《毕业设计&学习Demo》--基于Springboot+Vue的学生读书笔记共享毕业源码案例设计.zip

    本人十余年JAVA从业经验,擅长JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA系统性的技术提升的同学可与我联系,交个朋友哦~ 本人十余年JAVA从业经验,擅长JAVA高可用、分布式、高并发系统架构设计。有志...

    SpringBoot项目学生读书笔记共享.zip

    SpringBoot项目学生读书笔记共享系统是一个为学生、教师和书籍爱好者设计的网络应用程序,旨在提供一个便捷的读书笔记共享与管理平台。该系统通过集成用户注册、笔记上传、标签管理、内容搜索和社区互动等功能,实现...

    java8源码-JavaSE-Code:JavaSE的代码练习与学习笔记总结

    第二章:对象及变量的并发访问 只有共享的资源读写才需要同步化 方法中的变量不存在非线程安全的问题 哪个线程先执行带有synchronized关键字的方法,哪个对象就拥有该方法所属对象的锁Lock 当A线程调用anyObject对象...

    ConcurrentStudy:Java并发编程和netty中学习加强相关代码

    笔记已保存在语雀中,笔记参考自老师笔记和自己二次整理理解 视频快速链接: 黑马==> 2.项目模块说明 ConcurrentStudy -- 父项目,公共依赖 │ ├─heima -- 黑马并发编程 │ │ ├─a -- 第一章:概览、第二章:...

    《毕业设计&代码复用》--JSP基于SSM云笔记资料文件共享网设计可升级SpringBoot毕业源码案例设计.zip

    本人十余年JAVA架构设计经验,擅长JAVA高可用、分布式、高并发系统架构设计。有志于做JAVA系统性的技术提升的同学可与我联系,交个朋友哦~ 本人十余年JAVA架构设计经验,擅长JAVA高可用、分布式、高并发系统架构...

    word源码java-ShangGuiGu-ZhouYang-JUC:周阳-juc

    复习java基础知识的笔记 进程和线程: 进程和线程主要区别在于他们是操作系统不同的资源管理方式. 进程是程序的一次执行过程(运行中的程序),是系统运行程序的基本单位. 一个进程至少包含一个线程(main), 可以包含多个...

    Java并发学习笔记(二)——Synchronized关键字与ReetrantLock同步锁

    一、Synchronized ...被Synchronized 关键字描述的方法或代码块在多线程环境下数据是同步的,即当获取到锁后先将内存复制到自己的缓存中操作,释放锁之前会把缓存中的数据复制到共享内存中,所以保证了可

    笔记、Laravel、PHP、面试题、MySQL、HTML、CSS、Java

    用 markdown 书写的笔记(部分来源于互联网),共享出来给大家! 面试题系列: PHP面试题汇总 #1 PHP面试题汇总二 #4 代码片段: 实现QQ/微信拼手气红包算法:这里仅考虑红包分配自身,不考虑并发、超时退回等逻辑...

Global site tag (gtag.js) - Google Analytics