加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
当前仅当满足一下所有条件时,才应该使用volatile变量:
- 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
- 该变量不会与其他状态变量一起纳入不变性条件中。
- 在访问变量时不需要加锁。
线程封闭:当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术被称为线程封闭(Thread Confinement).
Ad-hoc 线程封闭是指,维护线程封闭性的职责完全由程序实现来承担。
不可变对象
但满足以下条件时,对象才是不可变的:
- 对象创建以后其状态就不能修改。
- 对象的所有域都是final类型。
- 对象是正确创建的。
要安全地发布一个对象,对象的引用以及对象的状态必须同时对其他线程可见。一个正确构造的对象可以通过以下方式来安全地发布:
- 在静态初始化函数中初始化一个对象引用。
- 将对象的引用保存大volatile类型的域或者AtomicReference对象中。
- 将对象的引用保存到某个正确构造对象definal类型域中。
- 将对象的引用保存到一个由锁保护的域中。
在并发程序中使用和共享对象时,可以使用一些实用的策略,包括:
- 线程封闭。 线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改。
- 只读共享。 在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它。共享的只读对象包括不可变对象和事实不可变对象。
- 线程安全共享。 线程安全的对象在其内部实现同步,因此多个线程可以通过对象的共有接口来进行访问而不需要进一步的同步。
- 保护对象。 被保护的对象只能通过持有特定的锁来访问。保护对象包括封装在其他线程安全对象中的对象,以及已发布的并且由某个特定锁保护的对象。
分享到:
相关推荐
《java jdk 7学习笔记》适合java的初中级读者,以及广大java应用开发人员。 作译者 林信良(网名:良葛格) 学历:台湾大学电机工程学系 经历:台湾升阳教育训练技术顾问、专业讲师,oracle授权训练中心讲师 ...
在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。 《实战Java高并发程序设计》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于...
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
Java SE 8 通过减少样板代码,改进了集合和注释,简单的并行编程模型和更有效地利用现代多核处理器,提高了开发人员的工作效率和显着的增强了应用程序的性能。 Java SE 8u172 版本更新:2018年4月17日
Java SE 8 通过减少样板代码,改进了集合和注释,简单的并行编程模型和更有效地利用现代多核处理器,提高了开发人员的工作效率和显着的增强了应用程序的性能。 Java SE 8u172 版本更新:2018年4月17日
第1章 java程序设计风格 1.1 java文件名与文件组织结构 1.2 java文件注释头 1.3 包的声明与引用 1.4 类与接口的声明 1.5 java源文件编排格式 代码行长度与折行规则 1.6 程序注释 1.7 变量的声明初始化与放置 1.7.1 ...
(3)简化异步事件的处理:服务器应用程序在接受来自多个远程客户端的请求时,如果为每个连接都分配一个线程并且使用同步IO,就会降低开发难度 (4)用户界面具备更短的响应时间:现代GUI框架中大都使用一个...
snmp源码软件开发笔记 请分叉并贡献。 编排、配置管理和 DevOps 工具: - Packer 是一种用于从单一源配置为多个平台创建相同机器映像的工具。 - 服务器自动化框架和应用 - Vagrant 是用于创建和配置虚拟开发环境的...
适用于各种开发语言和开发工具的很棒的库。 给出了一些推荐的选项。 您还可以看到更多选项。 本网站来源: 常见的 石英 提琴手 戈格斯 影袜 kcptun 代理链 海文件 邮差 代理 平++ 图形语言 免费的 SSL 证书 ...
java程序员刷题软件文件夹 这个存储库包含我参与过的著名程序和项目的集合。 README 为每个程序提供了简要说明,以及...我开发的轻量级笔记应用程序,灵感来自 Google Keep。 从美国境内的监测站收集预测和历史潮汐信
流动站java笔试题我写的笔记到处都是,我的写作也是如此。 所以我将尝试将它集中在这里。 专注于语言:C++、Javascript 和 Go。 我将在我生命的接下来几年中使用这些语言 - 最好用几种语言完善自己,而不是把所有...
其中内容均为前段时间研究开源搜索引擎时搜集参考的资料,非常齐全包含的内容有: Computing PageRank Using Hadoop.ppt Google的秘密PageRank彻底解说中文版.doc ...用_Hadoop_进行分布式并行编程.doc
沙里亚尔的笔记 原则 比特科技 算法 CI / CD 开发运维 地理信息系统 集成开发环境 3D 资源 概念 统一 虚拟现实 云 云 蔚蓝 Kubernetes 语言能力 Java s VueJS 打字稿 React p Cpp C# F# 去 斯威夫特/ ...
开发笔记 在我的 Windows 8 笔记本电脑上,当您尝试一次扫描两个或三个以上的主机时,我注意到 NMAP 存在问题。 我正在并行运行请求,所以我不确定这是否是由 java 承诺或 NMAP 本身无法同时运行引起的错误。 这个...
这种架构使得前后端可以并行开发,大大提高了开发效率。 系统功能丰富,包括用户管理、课程管理、在线学习、考试评估等多个模块。用户管理模块可以实现用户的注册、登录、信息修改等功能;课程管理模块可以对课程...
在专业课程中开发的材料和脚本 Minas Gerais天主教大学(PUC-MG)使用Python 3以及关系和非关系数据库(Oracle,MongoDB,Redis,Neo4J)的脚本和笔记本存储库,用于数据科学和大数据的毕业后研究) 技术涵盖 的...
执行mvn clean install或者对于并行构建,执行mvn -T 2.0C clean install 。 在使用了几年的适度开发笔记本电脑上,后者的构建花费了不到两分钟的时间。 经过大量输出之后,您最终应该会看到一条成功消息。
layer)是一个用于编写并行应用程序的软件开发框架。DOL允许指定基于计算Kahn进程网络模型的应用程序和具有一个基于SystemC的模拟引擎的特点。而且,DOL提供了一个基于XML规范的格式来描述在一个多处理器系统上的并行...
matlab 梁代码 目录 C++ C++ STL Java 数据结构与算法 Internet ...《CUDA并行程序设计-GPU编程指南》读书笔记 《设计模式之禅》读书笔记 微信公众平台开发 WordPress git IDE UML Matlab DSP 其他
CloudSimEx项目的目标是为 CloudSim 模拟器开发一组扩展。 证明值得的扩展稍后将与 CloudSim 合并。 笔记! 这些扩展在与 CloudSim 集成之前不受 CloudSim 团队的正式支持。 目前CloudSimEx 的特点: 网络会话建模...