前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中多线程的使用(超级超级详细)线程安全原理解析 4

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

作者头像
一只胡说八道的猴子
发布2020-09-27 10:04:51
3360
发布2020-09-27 10:04:51
举报

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

什么是线程安全?

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

代码语言:javascript
复制
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();
    }
}
代码语言:javascript
复制
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,就导致了问题的发生

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java中多线程的使用(超级超级详细)线程安全 4
  • 什么是线程安全?
  • 线程安全原理解析
  • 卖票出现了负数的票
  • 卖票出现了重复的票
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档