首页 > 其他分享 >使用同步代码块解决线程安全问题

使用同步代码块解决线程安全问题

时间:2022-10-22 17:57:49浏览次数:53  
标签:同步 Thread 代码 chepiao 线程 new 共享

使用同步代码块解决线程安全问题

package A_ShangGuiGu.Thread.ThreadDemo;

/**
* 例子:三个窗口买票,使用实现Runnable接口的方法。
* 1.出现的问题:卖票过程中出现了重票,错票的问题。——————————》线程的安全问题
* 2.问题出现的原因:在一个线程操作共享数据的时候,还没有操作完成的时候,另一个线程也开始操作共享数据。
* 3.解决方法:当线程a在操作数据的时候,别的线程不能参与进来,直到线程a完成共享数据的操作后,线程b才可以开始操作共享数据,
*         这种情况下,即使线程a阻塞,其他的也不能操作。
* 4.在java中通过同步机制来解决线程的安全问题。
* 5.同步的方式,解决了线程的安全问题-----》好处
*   操作同步代码时,只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低。----局限性
* 6.在实现接口创建线程的方式中,我们可以使用this来充当锁(同步监视器)
* 7.在实现接口或者继承方式创建线程中,都可以使用(类名.class)来充当锁
*     方式一:同步代码块
*         synchronized(同步监视器){
*             //需要被同步的代码
*         }
*         说明:操作共享数据的代码即为需要被同步的代码。
*         共享数据:多个线程共同处操作的数据或变量,比如chepiao就是共享数据
*         同步监视器:俗称锁。
*         任何一个类的对象都可以充当同步监视器
*         要求:多个线程必须使用同一把锁(同一个同步监视器、同一个对象)
*
*     方式二:同步方法
*/
class MaiPiao implements Runnable{
   private int chepiao = 100;
   Object obj = new Object();
   @Override
   public void run() {
       while (true) {
           synchronized (MaiPiao.class){
               if (chepiao > 0) {
                   try {
                       Thread.sleep(10);
                  } catch (InterruptedException e) {
                       throw new RuntimeException(e);
                  }
                   System.out.println(Thread.currentThread().getName() + ":" + chepiao);
                   chepiao--;
              } else {
                   break;
              }
          }
      }
  }
}
public class ThreadWindowTest {
   public static void main(String[] args) {
       MaiPiao maiPiao = new MaiPiao();
       Thread t1 = new Thread(maiPiao);
       Thread t2 = new Thread(maiPiao);
       Thread t3 = new Thread(maiPiao);

       t1.setName("窗口1");
       t2.setName("窗口2");
       t3.setName("窗口3");

       t1.start();
       t2.start();
       t3.start();
  }
}
 

标签:同步,Thread,代码,chepiao,线程,new,共享
From: https://www.cnblogs.com/zhazhawei906/p/16816784.html

相关文章

  • 进程与线程的区别
     线程与进程的根本区别是进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。  在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包......
  • devexpress中grid控件教程 多线程异步加载数据,进度条展示
    devexpress中最强大的控件,要数它的Grid了。几乎任务数据都可以展示,但今天要用它做另一个功能。假设我们开发这样一款软件:视频编辑软件。里面有个功能,提取视频中的音频。一......
  • html模板每行代码的意思
      1     <>单标签  一般用于声明属性     2     <></>双标签决定范围(<html></html>表明了html文件的范围) 3      <h......
  • 进程与线程
    简介1、进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,简而言之就是程序的一次执行过程,也可以直接理解为电脑上的软件的运行情况,通过电脑的任务管......
  • 多线程
    线程简介多任务现实中太多同时做多件事情的例子,看起来是多个任务都在做,其实本质上我们的大脑同时只做了一件事多线程原来是一条路,慢慢因为车太多了,道路阻塞,效率极......
  • 代码复现:Copy-Paste 数据增强for语义分割
    一、前言前些天分享了一篇谷歌的数据增强论文,解读在这:https://www.cnblogs.com/tangjielin/p/16812816.html。可能由于方法比较简单,官方没有开源代码,于是,我自己尝试在语......
  • UEC++ 多线程(二) AsyncTask
    AsyncTaskAsyncTask系统实现的多线程与自己实现继承的FRunnable实现的原理相似,还可以利用UE4提供的线程池。当使用多线程不满意时也可以调用StartSynchronousTask改成主线......
  • 线程与进程
    今天我们就来主要介绍一下什么是线程和进程,线程和进程并没有表面上看起来这么简单。一、进程定义:进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,......
  • 单核多线程可见性问题
    背景学习群上有个同学提出问题,如下截图这里可以看到分歧点,我认为JMM协议规定了工作内存,那么即使是单核,JAVA虚拟机也会保证线程本地内存变量的私有性,所以会存在不可见。......
  • java线程的优先级
    packageA_ShangGuiGu.Thread.ThreadDemo;/***优先级*1.MAX_Priority-----最大优先级为10*2.MIN_Priority-----最小优先级为1*3.NORM_Priority----默认优先级5*4......