我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java volatile关键字特性实例代码分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java volatile关键字特性实例代码分析

这篇文章主要讲解了“Java volatile关键字特性实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字特性实例代码分析”吧!

一、概述

关键字volatile虽然增加了实例变量在多个线程之间的可见性,但它却不具备同步性,那么也就不具备原子性。

二、特性详解

原子性是指一个线程的操作是不能被其他线程打断的,同一时间只有一个线程对一个变量进行操作。在多线程情况下,每个线程的执行结果不受其他线程的干扰,比如说多个线程同时对同一个共享成员变量n++ 100次,如果n的初始值为0,n最后的值应该是100,所以说多个线程是互不干扰的,这就是原子性的理解。但是实际n++b并不是原子性操作,n最后的值可能会不是100。

非原子性代码演示:

@Testpublic void test2() {   DataDemo dataDemo = new DataDemo();   for (int i=0; i<20; i++) {       CountAddThread thread = new CountAddThread(dataDemo);       thread.start();   }   while (Thread.activeCount() > 1) {       Thread.yield();   }   System.out.println("number值增加了20000次,此时number的实际值为:" + dataDemo.getNumber());}public class DataDemo {    volatile private int number = 0;    public void add() {        this.number = this.number + 10;    }    public int getNumber() {        return number;    }    public void addOne() {        this.number = this.number + 1;    }}public class CountAddThread extends Thread {    private DataDemo dataDemo;    public CountAddThread(DataDemo dataDemo) {        this.dataDemo = dataDemo;    }    @Override    public void run() {        for (int i=0; i<1000; i++) {            dataDemo.addOne();        }    }}

执行结果:
number值增加了20000次,此时number的实际值为:19699

结果分析:

this.number = this.number + 1 并不是一个原子操作,也就是非线程安全的。this.number = this.number + 1 的操作步骤分解如下:

(1)从内存中取出number的值;

(2)计算number的值;

(3)将number的值写到内存中;

假设在第2步计算值的时候,另外一个线程也修改i的值,那么这个时候就会出现脏数据。解决的办法其实就是使用synchronized关键字。所以说volatile本省并不处理数据的原子性,而是强制对数据的读写及时影响到主内存的。

解决办法:

(1)使用synchronized

可以通过对addOne方法添加synchronized关键字修饰,这样每次只有1个线程能执行addOne方法。

(2)使用JUC包下的AtomicInteger原子类进行实现。

原子操作是不能分割的整体,没有其他线程能够中断或检查正在原子操作中的变量。一个原子(atomic)类型就是一个原子操作可用的类型,它可以在没有锁的情况下做到线程安全。

使用synchronized 示例

@Testpublic void test2() {   DataDemo dataDemo = new DataDemo();   for (int i=0; i<20; i++) {        CountAddThread thread = new CountAddThread(dataDemo);        thread.start();   }   while (Thread.activeCount() > 1) {        Thread.yield();   }   System.out.println("number值增加了20000次,此时number的实际值为:" + dataDemo.getNumber());}public class CountAddThread extends Thread {    private DataDemo dataDemo;    public CountAddThread(DataDemo dataDemo) {        this.dataDemo = dataDemo;    }    @Override    public void run() {        for (int i=0; i<1000; i++) {            dataDemo.addOne();        }    }}public class DataDemo {    volatile private int number = 0;    public void add() {        this.number = this.number + 10;    }    public int getNumber() {        return number;    }    synchronized public void addOne() {        this.number = this.number + 1;    }}

执行结果:
number值增加了20000次,此时number的实际值为:20000

使用AtomicInteger原子类示例

@Testpublic void test2() {   DataDemo dataDemo = new DataDemo();   for (int i=0; i<20; i++) {       CountAddThread thread = new CountAddThread(dataDemo);       thread.start();   }   while (dataDemo.getCount().get() != 20000) {       Thread.yield();   }   System.out.println("count值增加了20000次,此时count的实际值为:" + dataDemo.getCount());}public class CountAddThread extends Thread {    private DataDemo dataDemo;    public CountAddThread(DataDemo dataDemo) {        this.dataDemo = dataDemo;    }    @Override    public void run() {        for (int i=0; i<1000; i++) {            dataDemo.atomicAddOne();        }    }}public class DataDemo {    private AtomicInteger count = new AtomicInteger(0);    public AtomicInteger getCount() {        return count;    }    public void atomicAddOne() {        count.getAndIncrement();    }}

执行结果:
count值增加了20000次,此时count的实际值为:20000

感谢各位的阅读,以上就是“Java volatile关键字特性实例代码分析”的内容了,经过本文的学习后,相信大家对Java volatile关键字特性实例代码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java volatile关键字特性实例代码分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java volatile关键字特性实例代码分析

这篇文章主要讲解了“Java volatile关键字特性实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字特性实例代码分析”吧!一、概述关键字vola
2023-07-04

Java volatile关键字特性讲解下篇

JMM要求保证可见性、原子性、有序性,volatile可以保证其中的两个,本篇文章具体验证volatile的可见性,不原子性和禁重排,同时解决volatile的不保证原子性,让代码具有原子性
2022-12-12

Java volatile关键字的特性是什么

这篇文章主要讲解了“Java volatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字的特性是什么”吧!一、概述volatile是Ja
2023-07-04

JAVA并发中VOLATILE关键字的示例分析

小编给大家分享一下JAVA并发中VOLATILE关键字的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!并发编程中的三个概念:1.原子性在Java中,对基本
2023-06-15

Java中Volatile关键字详解及代码示例

一、基本概念先补充一下概念:Java内存模型中的可见性、原子性和有序性。可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了
2023-05-30

Java并发编程之关键字volatile的示例分析

这篇文章给大家分享的是有关Java并发编程之关键字volatile的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、作用被 volatile 修饰的变量1.保证了不同线程对该变量操作的内存可见性2.禁止
2023-06-15

Java Socket服务器关键代码配置的实例分析

这篇文章给大家介绍Java Socket服务器关键代码配置的实例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java Socket服务器在很多人使用的时候会出现或多或少的问题,其实在关键代码中有不少的问题需要我们
2023-06-17

Java关键字final的示例分析

小编给大家分享一下Java关键字final的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、常见问题所有的final修饰的字段都是编译期常量吗?如何理解
2023-06-15

Go1.18新特性之泛型实例代码分析

本篇内容主要讲解“Go1.18新特性之泛型实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go1.18新特性之泛型实例代码分析”吧!1. 一切从函数的形参和实参说起假设我们有个计算两数
2023-07-05

java代码实例分析

这篇文章主要介绍“java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java代码实例分析”文章能帮助大家解决问题。一、几个坑爹代码的目录1、这样使用 StringBuffer 的方法
2023-06-16

Java Web关键字填空示例分析

今天小编给大家分享一下Java Web关键字填空示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。(1)在TestSer
2023-06-30

Java新特性使用实例分析

这篇文章主要介绍“Java新特性使用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java新特性使用实例分析”文章能帮助大家解决问题。枚举:尽管在 JDK 5 中增加了枚举类型,但是 Cla
2023-06-27

Java字节码实例分析

这篇文章主要讲解了“Java字节码实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java字节码实例分析”吧!一:Java字节代码的组织形式类文件{OxCAFEBABE,小版本号,大版
2023-06-17

java基础之关键字的示例分析

这篇文章将为大家详细讲解有关java基础之关键字的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、static关键字1.1 使用static关键字定义属性在讲解static定义属性操作之前,首先
2023-06-20

PHP关键特性之命名空间的示例分析

这篇文章主要介绍PHP关键特性之命名空间的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!你知道命名空间主要是为了解决代码中类和函数可能存在冲突的问题的吗?而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出
2023-06-15

python皮尔逊相关性数据分析分析及实例代码

这篇文章主要为大家介绍了python皮尔逊相关性分析及实例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-15

PHP和Java代码实例分析

这篇文章主要介绍“PHP和Java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP和Java代码实例分析”文章能帮助大家解决问题。命名案例1function getGoods($qu
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录