Java线程:volatile关键字

2023-10-26

本文转载至:http://lavasoft.blog.51cto.com/62575/222076

Java线程:volatile关键字
 
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。
 
谈及到volatile关键字,不得不提的一篇文章是:《Java 理论与实践: 正确使用 Volatile 变量》,这篇文章对volatile关键字的用法做了相当精辟的阐述。
 
之所以要单独提出volatile这个不常用的关键字原因是这个关键字在高性能的多线程程序中也有很重要的用途,只是这个关键字用不好会出很多问题。
 
首先考虑一个问题,为什么变量需要volatile来修饰呢?
要搞清楚这个问题,首先应该明白计算机内部都做什么了。比如做了一个i++操作,计算机内部做了三次处理:读取-修改-写入。
同样,对于一个long型数据,做了个赋值操作,在32系统下需要经过两步才能完成,先修改低32位,然后修改高32位。
 
假想一下,当将以上的操作放到一个多线程环境下操作时候,有可能出现的问题,是这些步骤执行了一部分,而另外一个线程就已经引用了变量值,这样就导致了读取脏数据的问题。
 
通过这个设想,就不难理解volatile关键字了。
 
volatile可以用在任何变量前面,但不能用于final变量前面,因为final型的变量是禁止修改的。也不存在线程安全的问题。
 
更多的内容,请参看::《Java 理论与实践: 正确使用 Volatile 变量》一文,写得很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java线程:volatile关键字 的相关文章

  • java并发包:读写锁

    本文转载至 http blog csdn net a910626 article details 51900954 ReadWriteLock是jdk5中提供的读写分离锁 读写分离锁可以有效的帮助减少锁竞争 以提升性能 用锁分离的机制来提升
  • (java基础知识)HashMap排序,Comparator接口详解

    对于List 可以调用Collections工具类的sort 方法 直接进行排序 HashMap 就没这么幸福了 其实 只要了解了Comparator这个接口之后 HashMap的排序也就不难了 无论是根据key 还是根据value排序 这
  • Java 父类 与子类之间的转换

    一 子类的实列化通过父类实现 代码正常 二 基于子类的实列化是通过父类实现 强制转换父类 代码正常 三 父类的实列化不能强制转换为子类 代码错误 提示 java lang ClassCastException 针对第三种情况 建议采用方案
  • Java线程:线程的同步-同步方法

    本文转载至 http lavasoft blog 51cto com 62575 221914 Java线程 线程的同步 同步方法 线程的同步是保证多线程安全访问竞争资源的一种手段 线程的同步是Java多线程编程的难点 往往开发者搞不清楚什
  • (java 功能篇)java 读取Propety配置文件

    java效果代码 源代码 package com rf test import java io IOException import java io InputStream import java util Properties publi
  • java 线程:概念与原理

    本文转载至 http lavasoft blog 51cto com 62575 99150 一 操作系统中线程和进程的概念 现在的操作系统是多任务操作系统 多线程是实现多任务的一种方式 进程是指一个内存中运行的应用程序 每个进程都有自己独
  • java并发包:概论

    本文转载至 http blog csdn net a910626 article details 51900917 为什么要学习并发 今天和一哥们聊天 聊着聊着聊到钱的方面 当时我就说 全世界60亿人 要是每人给我一块钱那不就发财了啊 哥们
  • java 多线程 总结三

    本文转载至 http blog csdn net vking wang article details 9952063 1 synchronized 把代码块声明为 synchronized 有两个重要后果 通常是指该代码具有 原子性 at
  • Java线程:并发协作-死锁

    本文转载至 http lavasoft blog 51cto com 62575 222074 Java线程 并发协作 死锁 线程发生死锁可能性很小 即使看似可能发生死锁的代码 在运行时发生死锁的可能性也是小之又小 发生死锁的原因一般是两个
  • Java 生成随机数全数字方式

    生成9位随机数字 System out println int Math random 9 1 100000000 生成8位随机数字 System out println int Math random 9 1 10000000 生成6位随
  • Java 数组 初始化方式 和遍历方式

    Java 数组 初始化方式总结 第一种 静态初始化 所谓静态初始化 初始化时由程序员显式指定每个数组元素的初始值 有系统决定数组的长度 简单实例 String strArr 张三 李四 王五 第二种 动态初始化 所谓动态初始化 初始化时由程
  • java 多线程学习笔记之 线程互斥

    许多线程共享同一数据 这种情况在现实的生活中也是经常发生的 比如火车站的火车票售票系统 火车票售票系统是一个常年运行的系统 为了满足乘客的需求 我们不能只设一个窗口 必须设很多的售票窗口 每个售票窗口就像一个线程 它们各自运行 共同访问相同
  • Java线程:新特征-信号量

    本文转载至 http lavasoft blog 51cto com 62575 222469 Java线程 新特征 信号量 Java的信号量实际上是一个功能完毕的计数器 对控制一定资源的消费与回收有着很重要的意义 信号量常常用于多线程的代
  • java 多线程 总结一

    首先讲一下进程和线程的区别 进程 每个进程都有独立的代码和数据空间 进程上下文 进程间的切换会有较大的开销 一个进程包含1 n个线程 线程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器 PC 线程切换开销小 线程和进程一
  • 代码质量保障第2讲:单元测试 - 浅谈单元测试

    代码质量保障第2讲 单元测试 浅谈单元测试 本文是代码质量保障第2讲 浅谈单元测试 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 这是基础 所以围绕着单元测试 我从网上搜集和总结了相关的概念 以助你完善体系
  • java并发包:重入锁与Condition条件

    本文转载至 http blog csdn net a910626 article details 51900941 重入锁 这里介绍一下synchronized wait notify方法的替代品 或者说是增强版 重入锁 重入锁是可以完全替
  • java 多线程学习笔记之 线程同步

    在前面我们将了很多关于同步的问题 然而在现实中 需要线程之间的协作 比如说最经典的生产者 消费者模型 当队列满时 生产者需要等待队列有空间才能继续往里面放入商品 而在等待的期间内 生产者必须释放对临界资源 即队列 的占用权 因为生产者如果不
  • Java线程:新特征-阻塞栈

    本文转载至 http lavasoft blog 51cto com 62575 222530 对于阻塞栈 与阻塞队列相似 不同点在于栈是 后入先出 的结构 每次操作的是栈顶 而队列是 先进先出 的结构 每次操作的是队列头 这里要特别说明一
  • (Java 基础知识) Java 正则表达式

    一 概述 正则表达式是Java处理字符串 文本的重要工具 Java对正则表达式的处理集中在以下两个两个类 java util regex Matcher 模式类 用来表示一个编译过的正则表达式 java util regex Pattern
  • 线程管理之Thread类相关方法简介

    CurrentThread 静态方法 currentThread 方法可返回代码段正在被那个线程调用的信息 简单案列 打印main 方法 正在被那个线程调用 package com zzg thread import com zzg obj

随机推荐

  • 【Android开发】用户界面设计-在代码中控制UI界面

    效果图 实现方法 MainActivity package com example test import android app ActionBar LayoutParams import android app Activity imp
  • 三种电源防反接电路(二极管、PMOS)

    最近偶然看到PMOS防反接电路 感觉挺实用的 做个记录 软件 LTspice 二极管串联 以常用的5V 2A为例 常用二极管串联在电路中 在电源反接时 二极管承担所有的电压 有效防止电源反接损坏后级设备 但是 二极管上压降较大 损耗较高 使
  • 了解Golang基本数据类型

    文章目录 前言 一 整数数字 二 浮点数字 请注意 与前面的代码一样 Go 会从使用的值推断其数据类型 三 布尔型 四 字符串 五 常见转义字符 五 默认值 六 类型转换 总结 前言 Go 是一种强类型语言 这意味着你声明的每个变量都绑定到
  • Springboot日志级别

    一 开启Springboot详细日志 在application properties文件中添加以下代码 logging level root debug 二 sql打印在控制台 在application properties文件中添加以下代
  • 预测数值型数据:回归源码分析(1)

    回归模型比较简单 这里先简单介绍下 后面遇到难点再具体分析 回归的一般方法 1 收集数据 采用任意方法收集数据 2 准备数据 回归需要数值型数据 标称型数据将被转成二值型数据 3 分析数据 绘出数据的可视化二维图将有助于对数据做出理解和分析
  • 零基础入门microbit教程

    1 什么是microbit 1 micro bit 百度百科 micro bit 是一款由英国广播电视公司 BBC 推出的专为青少年编程教育设计的微型电脑开发板 2 官网介绍 The Micro bit Educational Founda
  • OC语言——点语法和成员变量的4种作用域及property和synthesize的使用

    点语法 点语法的本质还是方法调用 Person p Person new 点语法的本质还是方法调用 p age 10 p setAge 10 一 点语法注意点 implementation Person setter方法中的死循环 void
  • LLVM - 学习笔记一

    1 工具和库 LLVM中的独立工具 opt 在IR级对程序进行优化的工具 输入必须是LLVM的bitcode 生成的输出文件必须具有相同的类型 llc 通过特定后端将LLVM bitcode转换成目标汇编或目标问价的工具 llvm mc 能
  • Hadoop之MapReduce工作原理

    Hadoop由两部分组成 分别是分布式文件系统HDFS和分布式计算框架MapReduce 其中 分布式文件系统HDFS主要用于大规模数据的分布式存储 而MapReduce则构建在分布式文件系统上 对于存储在分布式文件系统的数据进行分布式计算
  • 【对比Java学Kotlin】在 foreach 中使用 break&continue

    正常情况下 我们只能在 loop 中使用 break 和 continue 但是 foreach 是扩展函数 不属于 loop 的范畴 如果我们想在 foreach 中达到 break 和 continue 的效果 只能使用 return
  • echo source 命令与 setup.bash与.bashrc文件

    编译完毕后键 echo source catkin ws devel setup bash gt gt bashrc source bashrc 本文分析这两条命令 echo 与source 以及setup bash文件与 bashrc两个
  • Flutter 布局Row(水平方向布局)、Column(垂直方向布局)、Wrap(可以自动换行的布局)、Flex(弹性布局)、Stack(叠层布局)、

    1 线性布局 Row 水平方向布局 Row 表示水平方向子组件的布局顺序 是从左往右还是从右往左 默认为系统当前Locale环境的文本方向 如中文 英语都是从左往右 而阿拉伯语是从右往左 TextDirection textDirectio
  • 通过模拟退火改进的Elman神经网络(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 神经网络是一个庞大的体系和概念 根据处理信息的不同方式来区分不同的network 比如根据处理信息结果的传递方向 分前馈型与反馈型 前馈型网络会根据输出数值来调整网
  • dede php调用指定文章,DedeCMS调用指定文章内容的两种实现方法

    有时候我们需要dedecms能够调用指定文章的内容 尤其是在建企业网站的时候 需要在首页调用网站简介联系我们什么的 今天 织梦技术研究中心就给大家介绍两种实现调用指定文章内容的方法 方法一 打开include inc arcpart vie
  • Golang基础 函数详解 函数基础

    文章目录 01 函数声明 02 更多样的参数列表 03 更灵活的返回值列表 参考资料 函数是一个固定的 可重复使用的程序段 子程序 它在实现单一或相关联功能的同时 还可以带有入口和出口 所谓的入口 就是函数参数即形参 通过这个入口把函数的参
  • 最强 Verilog 中 IP核 调用实现及思想

    写在前面 无论是在 ISE 还是 Vivado 中 关于 IP核 的调用都是非常方便的 所以对于初学者来说最关键的不是在 IP Catalog 中设置相关的 IP核 参数 而是在生成相关的 IP核 后该怎么做 也即如何让这些 IP核 为项目
  • 海思3516系列芯片SPI速率慢问题深入研究与优化(基于PL022 SPI 控制器)

    海思3516系列芯片SPI速率慢问题深入分析与优化 基于PL022 SPI 控制器 我在某个海思主控的项目中需要使用SPI接口来驱动一块液晶屏 液晶屏主控为 st7789 分辨率 240x240 图像格式 RGB565 查阅海思相关手册可知
  • HDU - 1598之为达目的不择手段(并查集的应用)

    find the most comfortable road Time Limit 1000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submissi
  • docker快速搭建redis集群(两种暴露宿主网络的方法)

    宿主机IP 192 168 123 181 方案一 host网络模式 1 新建6个容器节点 for port in seq 4001 4006 do docker run itd name redis port network host v
  • Java线程:volatile关键字

    本文转载至 http lavasoft blog 51cto com 62575 222076 Java线程 volatile关键字 Java 语言包含两种内在的同步机制 同步块 或方法 和 volatile 变量 这两种机制的提出都是为了