案例package com.duyang.thread.basic.basethread;

/**

* @author :jiaolian

* @date :Created in 2020-12-16 14:02

* @description:线程不安全分析

* @modified By:

* 公众号:叫练

*/

public class ThreadUnsafe {

public static void main(String[] args) {

Thread task = new Task();

Thread threadA = new Thread(task,"A");

Thread threadB = new Thread(task,"B");

Thread threadC = new Thread(task,"C");

Thread threadD = new Thread(task,"D");

Thread threadE = new Thread(task,"E");

threadA.start();

threadB.start();

threadC.start();

threadD.start();

threadE.start();

}

private static class Task extends Thread {

int count = 5;

@Override

public void run() {

/**

* jvm分3步骤;

* 1.获取count(从主内存获取值)

* 2.count减1(在各自寄存器完成)

* 3.保存count(刷新到主内存)

*

* 说下可能执行的过程...

* A线程获取cpu的count值为5,A线程先减去1,保存count值为4刷新到主内存,此时还没有执行System.out.println count

* 切换到B线程,此时B线程的count值为4,因为B线程是从主内存取的,B线程count值减去1为3,此时刷新到主内存,主内存值变为3

* 切换到A线程,执行System.out.println count=3

* 切换到B线程,执行System.out.println count=3

* 情况就是这样的

*

*/

count--;

System.out.println(Thread.currentThread().getName() + " "+count);

}

}

}

可能的结果

结果得到下图(结论1图)

按理说应该是这样的啊

对,你想的没错,但是线程A,B的count值都等于3也是有可能的,下面我们来分析下。

详细分析

对于代码中45行,i--其实在JVM中,其实可以分为3步。获取count值(从主内存获取值)

count减1(在各自寄存器完成)

保存count(刷新到主内存)

详细说下A,B实际上在机器中过程A线程获取cpu的count值为5,A线程先减去1,保存count值为4刷新到主内存,此时还没有执行System.out.println打印count值。如下图所示

切换到B线程,此时B线程的count值为4,因为B线程是从主内存取的,B线程count值减去1为3,此时刷新到主内存,主内存值变为3

切换到A线程,执行System.out.println count=3

切换到B线程,执行System.out.println count=3

C D E线程正常执行

这就是的执行过程。

结论

多线程安全一直是个很重要的话题,希望大家都能尽快理解掌握,希望大家喜欢!

我是叫练,多叫多练,欢迎大家和我一起讨论交流,我会尽快回复大家,喜欢点赞哦。

java 线程不安全例子_Java中多线程安全问题实例分析相关推荐

  1. java线程开启不了_Java中多线程启动,为什么调用的是start方法,而不是run方法?...

    前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...

  2. java 递归原理_Java中递归原理实例分析

    本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中 ...

  3. java抽象类接口举例代码_Java接口和抽象类实例分析

    本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相 ...

  4. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

  5. java线程能做什么_java中的多线程能做什么 ?基本作用能说下吗?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 给你写个最简单的 多线程分同步和异步的,我已经给你写上了synchronized ,但注释了,你可以顺便看看加上它和去掉他的区别! public clas ...

  6. java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系

    一.多线程产生安全问题 1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存 ...

  7. java线程池怎么创建_java中的线程池,如何创建?

    Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合). 我们可以使用ThreadPool框架来定位(或实现)线程池. 线程池可以包含多个线程.每当我们执行任何任务时,线 ...

  8. java线程睡眠一分钟_Java中的TimerTimerTask和线程睡眠

    我发现类似的问题在这里问,但没有回答我的满意.所以再次重申这个问题 – 我有一个需要定期完成的任务(比如说1分钟间隔).使用Timertask&计时器做这个,而不是创建一个新的线程,有一个无限 ...

  9. java责任链设计模式 订单_Java责任链设计模式实例分析

    本文实例讲述了Java责任链设计模式.分享给大家供大家参考,具体如下: 一 代码 abstract class AbstractHandler { private Handler Handler = ...

最新文章

  1. python全栈之nginx安装
  2. yy直播没声音html,驱动技巧:解决YY语音中麦克风无声或者有噪音的问题
  3. spark MLlib平台的协同过滤算法---电影推荐系统
  4. VS Code 全部快捷键一览表(巨TM全)
  5. 普通大学生的 Java 开发能力到什么水平才能进大厂?
  6. 22 MM配置-采购-采购信息记录-定义编码范围
  7. asp.net很有用的字符串操作类
  8. Linux部署Oracle
  9. 数组不能将数值传给int_[day day go]数组
  10. 现代编译原理——第五章:活动记录
  11. SET-Priority_Queue
  12. select引起的服务端程序崩溃问题
  13. 修改刷新没反应_【原神】全特产高效率采集线路和刷新时间
  14. 整合Arm处理器与SSD的NGD运算型储存装置
  15. STM32串口调试一直打印 00 00
  16. 最新小浣熊5.0漫画CMS精仿土豪漫画系统源码
  17. 几款基于ODE的机器人仿真软件
  18. cad填充密度怎么调整_CAD填充比例调好了,填充物数量怎么调,就是密度怎么调?...
  19. 矩阵基变换和坐标变换
  20. 补天漏洞平台为什么能吸引众多白帽和企业?

热门文章

  1. 概率论与数理统计(一)—— 联合概率、条件概率与边缘概率
  2. 机器学习实践指南(一)—— 总论
  3. java 取商_Java读取word文档,转换为网页
  4. redhat5.4 安装mysql_RedHat5.4搭建LAMP
  5. python自动化办公入门书籍-Python如此神奇,让繁琐工作自动化 (文中含Python基础)...
  6. python安装教程-PyCharm 安装教程(Windows)
  7. python读音有道-Python实现有道翻译+语音播报
  8. python和java的区别-Java和Python的区别 学Python语言好还是Java好
  9. python语言入门-分分钟入门python语言
  10. python是什么-了解什么是Python面向对象(1)