原子性,可见性:

在考虑线程安全时,首先要想到的是解决可视性问题,即是否可以用volatile解决,其次考虑是否原子性问题,如果有原子性问题,则考虑用同步,那么首先考虑是否用非阻塞ATOMIC类,如果不行,考虑用SYHRONIZE,再不行,考虑锁。当然锁的粒度细,但是不易使用。

volatile保证可见性,解决的问题是:主存数据与工作内存数据不一致。但是不能解决原子性面临的问题;例如线程i++, 多线程执行,总和不定是执行的预期结果,因为i++包含了几个步骤,即使其他线程可见,但是仍然不能解决问题。

volatile可以用作java bean成文 bean volatile模式,但是通过前面可以知道它需要是最简单的set/get(即原子操作),否则仍然存在线程安全问题;

volatile最适合作为状态标记。

关于long/double的原子性问题:

传统的机器是32位的,所以32位JVM一般操作的是32位,JVM保证《32的类型都是原子操作,但是允许对logn/double是非原子操作。但是鼓励进行原子操作。

那么如果不确定的情况下,可以用volatile来保证原子性,这是可见性之外volatile的一个特殊用途。

(1)同步可以解决可见性和原子性问题,本质上锁机制,因为可以直接用锁来解决,这2种方式都是阻塞式的,保证线程是串行的从而达到目标;

(2)可以采用atomic类包,这个是非阻塞的,通过CAS来实现,内部使用了volatile定义,所以可见性都可以保证。

(3)某些条件下,可以采用 volatile来实现弱同步,这种情况下一般不存在原子性问题才可以使用,因为它本身不保证原子性。例如最普通的java bean模式,及标志为boolean.等,但是大多JAVA BEAN不需要这些机制,因为不存在多线程修改问题。

对 原子性,可见性的理解相关推荐

  1. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  2. 原子性 可见性 有序性_极简主义的内容可见性

    原子性 可见性 有序性 A couple of years ago, Minimalism as a concept took over the design world. 几年前, 极简主义作为一种 ...

  3. java 线程 原子性_深入理解Java多线程与并发框架——Java内存模型与原子性、可见性、有序性...

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享!Java架构筑基​zhuanlan.zhihu.comJava架构筑基--专注于Java技术的研究与分享! 后续文章将首 ...

  4. java 类型不可视_jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

    简介: 阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力. 摩尔定律(Moore):该定律用于描述处理器晶体管数量与运行效率间的发展关系. 当价 ...

  5. 如何保证线程安全有序性_线程安全性-原子性-可见性-有序性

    一.相关定义: 线程安全类:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些进程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安 ...

  6. voliate深度解析原子性 可见性

    共享内存的变量与线程栈中的变量副本有可能在主存中,也有可能在cpu缓存中或者cpu寄存器中!!!. cpu结构 运算器.控制器.寄存器 三级缓存 加快cpu的执行效率 LO寄存器->L1C> ...

  7. java原子性是什么,java 原子性 可见性 有序性

    原子性 原子性是指一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 如向变量x赋值操作 x = 10 是原子性的,就不会出现赋值操作进行到一半(x的低16位赋值成功,高16位没有赋 ...

  8. java原子性和原子操作理解

    原子性:即一个操作或者多个操作 要么全部执行 并且执行的过程不会被任何因素打断,要么就都不执行. 举个例子:假如为一个32位的变量赋值过程不具备原子性的话,会发生什么后果? int i=9: 假若一个 ...

  9. 阿里P8的这点Java底层?(合集)

    JVM内存模型 内存模型图 四个概念 class文件 class文件就是我们说的字节码文件,它是由.java..groovy等文件通过编译器解析产出的文件.class文件才是jvm要使用的文件. cl ...

最新文章

  1. 谈谈SaaS创业和企业服务的常识
  2. .net项目技术选型总结
  3. 运算放大器的好坏判别方法
  4. web3.js(三)查询智能合约币数量(erc20)
  5. 架构风格:万金油CS与分层
  6. 点按钮ajax get方法修改0或1状态封装成函数
  7. 【Socket网络编程】12. send()、recv()、sendto() 和 recvfrom() 函数解析
  8. oracle 查看动态性能视图,oracle常用动态性能视图
  9. shell脚本验证ssh连通性_ssh远程管理服务
  10. ASP.NET MVC2用户界面的巨大改变
  11. linux的jdk、tomcat、tomcat安装等
  12. clob oracle 连接_32天 Oracle 导入导出.
  13. webrtc学习--websocket服务器(二) (web端播放h264)
  14. Markdown中LaTeX公式编号
  15. 很好看的source insight配色方案
  16. signature=530d9c5e7e99d796faa35352560aede4,Visual Detection of Volcanic Plumes
  17. 洛谷-2028 龙兄摘苹果
  18. 2020张宇1000题【好题收集】【第四章:多元函数微分学】【第五章:二重积分】
  19. 面试flink开发岗位,看这些就够啦
  20. 邓凡平WIFI学习笔记4:WiFi Simple configuration

热门文章

  1. TypeError: argument of type ‘NoneType‘ is not iterable
  2. Kali无线渗透获取宿舍WiFi密码(WPA)
  3. 网络应用程序的通信视角
  4. 如何通过网络ActiveSync同步
  5. ASP.NET缓存 之 Web服务器缓存
  6. 安装黑群晖不求人,arpl在线编译安装群晖教程
  7. rsync大批量删除文件
  8. 基于OSGi的企业级开发框架实践——序篇
  9. C++ 数据存储类型
  10. Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Compressed class space