Java中多线程的使用(超级超级详细)线程安全原理解析 4

pjhaymy 2020-07-16 原文


Java中多线程的使用(超级超级详细)线程安全原理解析 4


Java中多线程的使用(超级超级详细)线程安全 4

什么是线程安全?

在这里插入图片描述

有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样,这就是线程安全
我们下面来用一段代码来演示线程不安全的情况,下面用车站卖票来举例

package ThreadSafe;

public class Main {
    public static void main(String[] args) {
    //使用同一个对象
        ThreadSafe threadSafe = new ThreadSafe();
        Thread  one = new Thread(threadSafe, "一号");
        Thread two = new Thread(threadSafe, "二号");
        Thread three = new Thread(threadSafe, "三号");
        one.start();
        two.start();
        three.start();
    }
}
package ThreadSafe;

public class ThreadSafe implements Runnable {
    private  int ticketsum=100;
    public  void  run(){
      while(true){
          if (ticketsum>0){
              try {
                  Thread.sleep(10);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              String name = Thread.currentThread().getName();
              System.out.println(name+"正在卖:"+ticketsum--);
          }
      }

    }
}

结果
在这里插入图片描述

我们发现一号二号三号都在重复卖同一张票,这种问题在现实生活中是不被允许出现的,是会出现事故的,这就是线程不安全导致的问题

下面我们来讲解为什么会出现线程安全问题

线程安全原理解析

在这里插入图片描述

卖票出现了负数的票

在这里插入图片描述

卖票出现了重复的票

在这里插入图片描述这样理解起来我当初还思考了好久,不过体验一下下面这段话后我就有点领悟了:
多线程并不是线程并行(真正的线程并行需要多个cpu),而是通过cpu时间片轮换来完成的,所以就存在一个问题,当a线程进入线程体的时候,执行了System.out语句,这是他的时间片到期了,b线程进入,b线程在他的时间片内执行完了之后,a线程接着往下运行,他用的不是b执行过的ticket–,而是原来的ticket,就导致了问题的发生

以上就是我对线程安全的一些理解,如果有错误还请各位批评指正,喜欢我的可以点赞收藏一波,我基本每天都会跟新文章,可以关注我互相交流

在这里插入图片描述

posted on
2020-07-16 13:41 
一只胡说八道的猴子 
阅读(
评论(
编辑 
收藏

 

版权声明:本文为pjhaymy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/pjhaymy/p/13322212.html

Java中多线程的使用(超级超级详细)线程安全原理解析 4的更多相关文章

  1. 章节六、3-读取Properties属性文件

    一、如何读取Properties文件1、创建一个名为ReadingProperties的类 2、创建一个.pr […]...

  2. 【Java】手把手理解CAS实现原理

    先来看看概念,【CAS】 全称“CompareAndSwap”,中文翻译即“比较并替换”。 定义:CAS操作包 […]...

  3. java日期详解

    java日期详解 [TOC] 一、简介 java中的日期处理一直是个问题,没有很好的方式去处理,所以才有第三方 […]...

  4. String源码理解之indexOf函数

    1前言 不多说,直接上源码 2源码 我自己的理解,可能表述不清,多看几遍,不行就debug跟一遍代码自然就懂了 […]...

  5. 1.对象和类的简单解析

    1.对象和类的简单解析 1.1.对象的简单内存 堆(Heap) 此内存区域的功能是存放对象的实例,存放由new […]...

  6. jdk的动态代理和静态代理你还写不出来嘛???

    一、什么叫jdk的代理? 用另外一个对象去代理实际对象的操作 分为动态代理和静态代理二、先说说静态代理 从字面 […]...

  7. 大数据开发之路—Java基础(二)面向对象(上)

    面向对象基础知识 面向对象是相对面向过程而言的 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向 […]...

  8. 举例理解JDK动态代理

    JDK动态代理 说到java自带的动态代理api,肯定离不开反射。JDK的Proxy类实现动态代理最核心的方法 […]...

随机推荐

  1. CentOS7安装Oracle 11g数据库

    一、准备 1. Oracle11g安装包: p13390677_112040_Linux-x86-64_1of […]...

  2. Hexo的next主题安装

    1、使用git克隆最新版本   2、先在themes目录创建一个next文件夹,然后在hexo站点目录下右键打 […]...

  3. airflow的安装和使用 – 完全版

    之前试用了azkaban一小段时间,虽然上手快速方便,但是功能还是太简单,不够灵活。 Airflow使用代码来 […]...

  4. linux下自动获取并安装软件包 apt-get 的命令介绍

    apt-cache search package    搜索包 apt-cache show package  […]...

  5. Android是什么?

         android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux […]...

  6. AndroidStudio项目制作倒计时模块

    前言 大家好,给大家带来AndroidStudio项目制作倒计时模块的概述,希望你们喜欢 项目难度 Andro […]...

  7. 一、爬虫的基本体系和urllib的基本使用

    一、爬虫的基本体系和urllib的基本使用   爬虫     网络是一爬虫种自动获取网页内容的程序,是搜索引擎 […]...

  8. 支付功能设计及实现思路

    支付功能设计及实现思路 支付功能设计 主要包括:订单表,订单日志表,订单队列,定时任务。 主要考虑:事务性、幂 […]...

展开目录

目录导航