Java可变引用,Java – 对可变对象的易失性引用 – 对对象的字段的更新对所有线程都是可见的...
这两个问题.我们从第二个开始吧.
将新构造的对象分配给易变量变量工作得很好.读取volatile变量的每个线程都将看到一个完全构造的对象.不需要进一步的同步.这种模式通常与不可变类型结合使用.
class Tree {
private volatile Node node;
public void update() {
node = new Node(...);
}
public Node get() {
return node;
}
}
关于第一个问题您可以使用volatile变量来同步对非易失性变量的访问.以下列表显示了一个示例.假设两个变量被初始化,如图所示,并且这两个方法是并发执行的.这是有保证的,如果第二个线程看到更新到foo,它也将看到更新bar.
volatile int foo = 0;
int bar = 0;
void thread1() {
bar = 1;
foo = 1; // write to volatile variable
}
void thread2() {
if (foo == 1) { // read from volatile variable
int r = bar; // r == 1
}
}
但是,你的例子是不同的.阅读和写作可能如下.与上述示例相反,两个线程都从volatile变量读取.但是,对volatile变量的读操作不会相互同步.
void thread1() {
Node temp = root; // read from volatile variable
temp.numOfKeys = 1;
}
void thread2() {
Node temp = root; // read from volatile variable
int r = temp.numOfKeys;
}
换句话说:如果线程A写入volatile变量x并且线程B读取写入x的值,则在读操作之后,线程B将看到在写入x之前发生的线程A的所有写操作.但是没有对volatile变量的写入操作,对其他变量的更新没有影响.
这听起来比实际上更复杂.其实,只有一条规则要考虑,你可以在JLS8 §17.4.5找到:
[..] If all sequentially consistent executions are free of data races,[..] then all executions of the program will appear to be sequentially consistent.
简单地说,如果两个线程可以同时访问相同的变量,则存在数据竞争,至少有一个操作是写入操作,并且该变量是非易失性的.可以通过将共享变量声明为volatile来消除数据竞赛.没有数据竞争,更新的可见性没有问题.
Java可变引用,Java – 对可变对象的易失性引用 – 对对象的字段的更新对所有线程都是可见的...相关推荐
- Java多线程:易失性变量,事前关联和内存一致性
什么是volatile变量? volatile是Java中的关键字. 您不能将其用作变量或方法名称. 期. 我们什么时候应该使用它? 哈哈,对不起,没办法. 当我们在多线程环境中与多个线程共享变量时, ...
- java什么叫一致性,java-顺序一致性易失性说明
我正在从Java Jpoint会议观看视频. 我对以下来自Alexey Shipilev报告的幻灯片有疑问: 打扰一下,请不要打扰我.实际上,作者说不可能将变量集设置为 r1 = 1 (Y) r2 = ...
- Java面试题 java高级
八:java高级 1:代码优化 (1)代码优化的目标是: 1 .减小代码的体积 2 .提高代码运行的效率 (2)代码结构层次的优化(目的:更加方便代码的维护–可维护性,可读性) 1.代码注释(代码规范 ...
- java面试题(java中高级面试题及答案)
[java面试题] 1.Collections.sort排序内部原理 在Java6Arrays.sort()和Collections.sort()中使用MergeSort,在Java7中,内部实现被T ...
- java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏
基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...
- java中可变类型,不可变类型,不可变引用,不可变封装
一.可变类型与不可变类型 不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型. 可变数据类型 :当该数据类型的对应变量的值发 ...
- Java可变类型与不可变类型
一.可变类型(mutable type)与不可变类型(immutable type) 已知,基本数据类型都是不可变类型:引用(对象)数据类型既有可变类型,也有不可变类型 首先区分:改变一个变量.改变 ...
- JAVA的可变类与不可变类
可变类和不可变类(Mutable and Immutable Objects) 1. 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当你获得这个类 ...
- Java系列(34)——可变字符串
本系列博客汇总在这里:Java系列_汇总 目录 一.StringBuffer 概述 二.StringBuffer 和 String 的区别 三.StringBuffer 的 append 方法 四.可 ...
最新文章
- 极客新闻——09、如何打造核心骨干团队
- linux中win文件转为unix,如何将文本文件从Windows转换为Unix
- 一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库
- 跨平台桌面应用开发工具Electron v11.0.4
- 无法生成会话打印机,点打印提示没有选择的打印机
- SetWindowPos详解
- 基于Javaweb实现小区物业管理系统
- HDMI CEC HDCP
- 从美术生到程序员转型之路【我的故事】
- shopnc nodejs安装
- pc端vue调用屏幕键盘
- 读书笔记:大型网站技术架构-核心原理与案例分析
- 感恩陪伴,链接未来 | Conflux杭州应用开发运营中心成立
- Java学习笔记(二)JavaSE
- Matlab逆向归纳法,6.完全信息动态博弈—逆向归纳法和子博弈完美均衡.ppt
- 什么是饥饿营销,饥饿营销案例以及饥饿营销的4个步骤
- 前端实现网图转base64
- idea怎么看jdk版本_怎么看自己的jdk版本
- Java丨即时聊天程序的实现
- Matlab底层算法实现基于动态阈值的自动白平衡算法
热门文章
- 清空文件夹_回收站不小心被清空?简单3步即刻找回丢失文件,值得收藏!
- php 类自动执行方法,php类讲解8:PHP 自动加载类 __autoload() 方法
- mysql in 数字类型_关于sql where id in 转换成数据类型 int 时失败
- EDAS投稿出现问题: notembedded: Upload failed: The font Helvetica is not embedded in the file
- matlab与STK互联(不使用connect软件的互联)
- ruby on rails连接mysql_ruby on rails 连接mysql数据库
- cron每月1号_微信服务号按粉丝标签分组群发消息怎样实现?
- Python机器学习:逻辑回归005决策边界
- java文件改成smla,Java base64 转 FileInputStream
- long double(64bit)