首页 > 其他分享 >线程安全的解释

线程安全的解释

时间:2023-03-07 20:12:50浏览次数:31  
标签:MyThread3 解释 Thread 安全 线程 new ticket public


思路:三个窗口卖票,我们需要设计3条线程表示都实现卖票的操作。并且因为我们的票数是一定的,所以我们需要将票数共享

package com.cook.test;
//实现卖票操作(实现Runnable接口实现)
public class MyThread3 implements Runnable {
    //定义票数并共享
    public static int ticket = 0;
    @Override
    public void run() {
      while (true){
         if(ticket<100){
             ticket++;
             try {
                 Thread.sleep(100);
             } catch (InterruptedException e) {
                 throw new RuntimeException(e);
             }
             System.out.println(Thread.currentThread().getName()+"已经卖了"+ticket+"张票"+"还剩下"+(100-ticket)+"张票");
         }else {
             break;
         }

      }
    }
}

package com.cook.test;

public class MyThreadTest3 {
    public static void main(String[] args) {
        MyThread3 t = new MyThread3();
        Thread t1 = new Thread(t,"窗口1");
        Thread t2 = new Thread(t,"窗口2");
        Thread t3 = new Thread(t,"窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}

但是以上程序会导致以下问题:

对于票号重复的解释


当我们的线程有自增后(tick=1)CPU被线程2抢走了,线程2自增后CPU并线程3抢走了(tick=3)然后打印的都是tick=3了

出现超出范围的票的解释


当我们的ticket是99的时候,线程1抢到cpu执行了ticket++(ticket100)的时候cpu被线程2签到也是执行到ticket++(ticket101)的时候cpu被线程3抢走然后执行ticket++(ticket==102)然后3个线程再次抢夺,打印出来的票号都是102了

以上2种原因的本质是:线程执行时,有随机性

解决方法---同步代码块

我们的某一个线程在执行的时候,可能不知道什么时候CPU的执行权就被其他线程抢走了。我们可以设置同步代码块,我们的一个线程在执行同步代码块时,这个同步代码块的锁就会关闭,只有当该线程执行完了锁才会打开,别的线程才能进入执行

package com.cook.test;
//实现卖票操作(实现Runnable接口实现)
public class MyThread3 implements Runnable {
    //定义票数并共享
    public static int ticket = 0;
    @Override
    public void run() {
      while (true){
          synchronized (MyThread3.class){
              if(ticket<100){
                  ticket++;
                  try {
                      Thread.sleep(100);
                  } catch (InterruptedException e) {
                      throw new RuntimeException(e);
                  }
                  System.out.println(Thread.currentThread().getName()+"已经卖了"+ticket+"张票"+"还剩下"+(100-ticket)+"张票");
              }else {
                  break;
              }

          }

      }
    }
}

package com.cook.test;

public class MyThreadTest3 {
    public static void main(String[] args) {
        MyThread3 t = new MyThread3();
        Thread t1 = new Thread(t,"窗口1");
        Thread t2 = new Thread(t,"窗口2");
        Thread t3 = new Thread(t,"窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}


为了确保我们的锁的对象唯一,我们可以时候当前类的字节码文件对象MyThread.class来表示,因为类的字节码文件是唯一的,所以其字节码文件的对象也是唯一的,锁对象的唯一使得我们的每一个线程面对的都是同一把锁,如果锁对象不唯一,线程面对的锁不一样,这其实就和没有写锁一样(锁对象用别的也可以,唯一就行)

标签:MyThread3,解释,Thread,安全,线程,new,ticket,public
From: https://www.cnblogs.com/swtaa/p/17189244.html

相关文章

  • C# Thread开启线程的几种方式
    C#Thread开启线程的几种方式2023-01-2308:20·opendotnet概述无论学习那门编程语言,多线程都是逃不掉的一个坎。为了提升程序整体的运行效率,我们一般都会把比较耗时......
  • 360安全浏览器使用IE7内核打开网站的设置方法
    1、首先打开电脑中的360安全浏览器,在浏览器右上角可以看到一个由三条横线组成“打开菜单”图标,使用鼠标点击该图标2、点击之后后弹出360安全浏览器的菜单窗口,在窗口中点......
  • 什么是密评?哪些信息系统需要做密码应用安全性评估?
    随着信息技术的飞速发展,网络安全形势愈发严峻,各种安全威胁来势汹汹,勒索软件、数据泄露等各种安全事件层出不穷。我国面临的网络安全问题同样严峻。而商用密码是保障网络空间......
  • C# - 请求被中止: 未能创建 SSL/TLS 安全通道。
    在调用接口前设置TLSHttpClientclient=newHttpClient();HttpContenthttpContent=newFormUrlEncodedContent(dic);ServicePointManager......
  • 多线程设计模式-全面详解(学习总结---从入门到深化)
    目录​​SingleThreadExecution设计模式​​​​机场过安检​​​​ 非线程安全​​​​ 问题分析​​​​首字母相同却未通过检查​​​​为何出现首字母不相同的情况......
  • 网络安全实践笔记
    网络安全实践密码学概述通信中的参与者发送者(Alice,爱丽丝):在双方交互中合法的信息发送实体。接受者(Bob,鲍勃):在双方交互中合法的信息接受实体。分析者(Eve,伊夫):破坏接受......
  • Windows操作系统安全加固-等保
    一、账户管理:1、分配账号:进入“控制面板->管理工具->计算机管理”,在“系统工具->本地用户和组”,结合要求和实际业务情况判断符合要求,根据系统的要求,设定不同的账户和......
  • Linux系统巡检、等保安全检查脚本
    以下shell脚本适合linux分支中的redhat、centos使用,运行脚本将结果输出到自定义的文件中,可将巡检脚本以root用户登录放在/usr/local/sbin的目录下执行。脚本只是一个检查......
  • C# 多线程(Thread和Task)
    C#多线程(Thread和Task)线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进......
  • Gini coefficient直观的解释与实现
    引言大家在机器学习中经常会看到基尼系数的词汇,有时候在做比赛的时候,有些赛题的ScoringMetric就是基尼系数。我们去Google或者Baidu,得到的都是些不甚满意的经济学相关......