原文:Visibility is subtle because the things that can go wrong are so counterintuitive.译文:可见性是微妙的,因为可能出错的事情是如此的有悖常理。
    public class NoVisibility {private static boolean ready;private static int number;private static class ReaderThread extends Thread {@Overridepublic void run() {while (!ready) {Thread.yield();}System.out.println(number);}}public static void main(String[] args) {new ReaderThread().start();number = 42;ready = true;}}

NoVisibility可能会持续循环下去,因为读线程可能永远都看不到ready的值。

一种更奇怪的现象是会发生重排序(Reordering),NoVisibility可能会输出0,因为读线程可能看到了写入ready的值,但却没看到之后写入number的值。
在没有同步的情况下,编译器(Compiler)、处理器(Processor)和运行时(Runtime)等都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得出正确的结论。
一、失效数据(stale data)
NoVisibility展示(demonstrated)的一种方式,在缺乏足够的同步程序中,可能会导致令人惊讶的结果:失效数据。(原文:NoVisibility demonstrated one of the ways that insufficiently synchronized programs can cause surprising results: stale data.)
失效数据还可能会带来诸如损坏的数据结构(corrupted data structures)、不精确的计算(inaccurate computations),以及无限循环(infinite loops)等。
二、非原子的64位操作(Nonatomic 64-bit operations)
线程的最低安全性(out-of-thin-air safety),是指当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值。
最低安全性适用于绝大数变量,但是存在一个例外:非volatile类型的64位数值变量(double and long)。Java的内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的long和double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作。
因此,在多线程中使用共享且可变的long和double等类型的变量也是不安全的,除非它们用volatile声明,或者由锁保护。
三、加锁和可见性(Locking and visibility)
内置锁可以用于确保某个线程以一种可预测的方式来查看另一个线程的执行结果。
在访问共享的可变变量时,我们有理由要求所有线程在同一个同步锁的规则,保证由某一个线程写的值对其它线程是可见的。否则,如果一个线程在未持有正确锁的情况下,读取某个变量,可能会看到一个失效的值。(原文:We can now give the other reason for the rule requiring all threads to synchronize on the same lock when accessing a shared mutable variable—to guarantee that values written by one thread are made visible to other threads. Otherwise, if  a thread reads a variable without holding the appropriate lock, it might see a stale value.)
加锁不仅仅是与互斥性相关,也与内存的可见性相关。为了确保所有线程都能看到共享变量的最新值,读写线程必须在同一个锁上同步。(原文:Locking is not just about mutual exclusion; it is also about memory visibility. To ensure that all threads see the most up-to-date values of shared mutable variables, the reading and writing threads must synchronize on a common lock.)

《Java Concurrency in Practice》之可见性(Visibility)相关推荐

  1. Java Concurrency In Practice

    线程安全 定义 A class is thread-safe if it behaves correctly when accessed from multiple threads, regardle ...

  2. 《Java Concurrency in Practice》中文版笔记

    第1章 简介 1.1 并发简史 茶壶和面包机的生产商都很清楚:用户通常会采用异步方式来使用他们的产品,因此当这些机器完成任务时都会发出声音提示. 1.2 线程的优势 线程能够将大部分的异步工作流转换成 ...

  3. 【读后感】Java Concurrency in Practice:7.线程池的使用

    0. 我是真的不知道为什么不打算开车还得考驾照 本章将介绍对线程池进行配置与调优的一些高级选项,并分析在使用任务执行框架时需要注意的各种危险,以及Executor的一些高级的使用方法. 1. 在任务与 ...

  4. 《Java Concurrency in Practice》之原子性(Atomicity)

    假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的.原子操作是指,对于访问同一个状态的所有操作(包括该操作本身)来说 ...

  5. Race condition--Java Concurrency In Practice C02读书笔记

    [本文是我对Java Concurrency In Practice第二章的归纳和总结,  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] 多线程环境下,无需调用方进行任何同步处理也能保 ...

  6. 深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]

    线程池数据结构与线程构造方法 由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构.图1描述了这种数据结构. 图1 Thre ...

  7. Java Concurrency Essentials教程

    课程大纲 并发一直是开发人员面临的挑战,编写并发程序可能非常困难. 引入并发性时,可能会发生很多事情,并且系统的复杂性会大大增加. 但是,编写健壮的并发程序的能力是开发人员的必备工具,并且可以帮助构建 ...

  8. Java并发:线程共享变量可见性原理

    0.线程安全性:线程安全性包括两个方面,①可见性.②原子性. 0.1.线程之间的通信:线程的通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种共享内存和消息传递. (1)在 ...

  9. web前端入门学习 css(6)(定位position)(元素的显示与隐藏display、可见性visibility、溢出overflow)(案例:土豆播放页)

    文章目录 什么是定位? 定位组成(定位模式+边偏移) 定位模式static relative absolute fixed 边偏移 定位模式--静态定位static(平时用不到)就是标准流 定位模式- ...

最新文章

  1. 暑期集训3:几何基础 练习题B: HDU - 2001
  2. 网站推广专员浅析网站推广运营如何提升企业网站转化率?
  3. 自动化监控--zabbix中的邮件报警通知详解
  4. Qt中的图像处理与绘制
  5. 【函数】02、函数进阶
  6. VMware Workstation 入门使用
  7. spring 多租户_使用Spring Security的多租户应用程序的无状态会话
  8. 数字图像处理知识总结
  9. 10年经验+20个数据管理项目,我总结出这4个用数据改变企业的精华
  10. 移动标准差以及移动平均值(movstd、movmean)
  11. python求最大回文数_python最长回文串算法
  12. 在tomcat中添加虚拟主机,myeclipse中整合jdk和tomcat
  13. 自动驾驶_感知_目标检测(基于图像)
  14. python淘宝自动发货源码_发货100虚拟商品自动发货系统下载
  15. 三级管输入输出特性曲线的分析
  16. 教你删除Mac下的iCloud数据
  17. 知乎上演的“变形计“,资本市场会打几分?
  18. 【MATLAB】求Taylor展开式
  19. 自动阅读项目又出新情况?一天秒封47个账号
  20. kml文件转成cvs_KML 转图层 (转换)

热门文章

  1. win10安装mujoco
  2. 头胀头晕的原因(眩晕)
  3. aux ps 和top_关于vmstat,top,ps aux查看的cpu占用率不一致的问题
  4. Python:线程同步,Barrier屏障
  5. Graph Neural Network for Traffic Forecasting: A Survey
  6. 【STM32】STM32之SWD
  7. 【PAT】1030 完美数列 (25 分)
  8. (私人收藏)古风PPT高级灰蓝传艺
  9. 微信小程序(一)初始微信小程序
  10. 图像区分平坦区域、边缘、角点区域