这两个问题.我们从第二个开始吧.

将新构造的对象分配给易变量变量工作得很好.读取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 – 对可变对象的易失性引用 – 对对象的字段的更新对所有线程都是可见的...相关推荐

  1. Java多线程:易失性变量,事前关联和内存一致性

    什么是volatile变量? volatile是Java中的关键字. 您不能将其用作变量或方法名称. 期. 我们什么时候应该使用它? 哈哈,对不起,没办法. 当我们在多线程环境中与多个线程共享变量时, ...

  2. java什么叫一致性,java-顺序一致性易失性说明

    我正在从Java Jpoint会议观看视频. 我对以下来自Alexey Shipilev报告的幻灯片有疑问: 打扰一下,请不要打扰我.实际上,作者说不可能将变量集设置为 r1 = 1 (Y) r2 = ...

  3. Java面试题 java高级

    八:java高级 1:代码优化 (1)代码优化的目标是: 1 .减小代码的体积 2 .提高代码运行的效率 (2)代码结构层次的优化(目的:更加方便代码的维护–可维护性,可读性) 1.代码注释(代码规范 ...

  4. java面试题(java中高级面试题及答案)

    [java面试题] 1.Collections.sort排序内部原理 在Java6Arrays.sort()和Collections.sort()中使用MergeSort,在Java7中,内部实现被T ...

  5. java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏

    基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...

  6. java中可变类型,不可变类型,不可变引用,不可变封装

    一.可变类型与不可变类型 不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型. 可变数据类型 :当该数据类型的对应变量的值发 ...

  7. Java可变类型与不可变类型

     一.可变类型(mutable type)与不可变类型(immutable type) 已知,基本数据类型都是不可变类型:引用(对象)数据类型既有可变类型,也有不可变类型 首先区分:改变一个变量.改变 ...

  8. JAVA的可变类与不可变类

    可变类和不可变类(Mutable and Immutable Objects) 1. 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当你获得这个类 ...

  9. Java系列(34)——可变字符串

    本系列博客汇总在这里:Java系列_汇总 目录 一.StringBuffer 概述 二.StringBuffer 和 String 的区别 三.StringBuffer 的 append 方法 四.可 ...

最新文章

  1. 极客新闻——09、如何打造核心骨干团队
  2. linux中win文件转为unix,如何将文本文件从Windows转换为Unix
  3. 一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库
  4. 跨平台桌面应用开发工具Electron v11.0.4
  5. 无法生成会话打印机,点打印提示没有选择的打印机
  6. SetWindowPos详解
  7. 基于Javaweb实现小区物业管理系统
  8. HDMI CEC HDCP
  9. 从美术生到程序员转型之路【我的故事】
  10. shopnc nodejs安装
  11. pc端vue调用屏幕键盘
  12. 读书笔记:大型网站技术架构-核心原理与案例分析
  13. 感恩陪伴,链接未来 | Conflux杭州应用开发运营中心成立
  14. Java学习笔记(二)JavaSE
  15. Matlab逆向归纳法,6.完全信息动态博弈—逆向归纳法和子博弈完美均衡.ppt
  16. 什么是饥饿营销,饥饿营销案例以及饥饿营销的4个步骤
  17. 前端实现网图转base64
  18. idea怎么看jdk版本_怎么看自己的jdk版本
  19. Java丨即时聊天程序的实现
  20. Matlab底层算法实现基于动态阈值的自动白平衡算法

热门文章

  1. 清空文件夹_回收站不小心被清空?简单3步即刻找回丢失文件,值得收藏!
  2. php 类自动执行方法,php类讲解8:PHP 自动加载类 __autoload() 方法
  3. mysql in 数字类型_关于sql where id in 转换成数据类型 int 时失败
  4. EDAS投稿出现问题: notembedded: Upload failed: The font Helvetica is not embedded in the file
  5. matlab与STK互联(不使用connect软件的互联)
  6. ruby on rails连接mysql_ruby on rails 连接mysql数据库
  7. cron每月1号_微信服务号按粉丝标签分组群发消息怎样实现?
  8. Python机器学习:逻辑回归005决策边界
  9. java文件改成smla,Java base64 转 FileInputStream
  10. long double(64bit)