首页 > 其他分享 >解决多线程的安全问题方式二

解决多线程的安全问题方式二

时间:2023-01-30 17:35:56浏览次数:47  
标签:Thread start 安全 解决 new ticket 多线程 public ThreadExtends

/**
* 解决多线程中线程安全的方式二:同步方法,操作共享数据的是一个方法
*   1.同步方法仍然涉及到同步监视器,只是不需要显示的声明
*   2.非静态的同步方法,同步监视器是this
*     静态的同步方法,同步监视器是类本身(类.class)
*
*
*
*/
public class ThreadMethodDemo {
    public static void main(String[] args) {
        RunnableImp1 runnableImp1 = new RunnableImp1();

        Thread thread1 = new Thread(runnableImp1);
        Thread thread2 = new Thread(runnableImp1);
        Thread thread3 = new Thread(runnableImp1);

        thread1.setName("Runnable窗口1");
        thread2.setName("Runnable窗口2");
        thread3.setName("Runnable窗口3");

        thread1.start();
        thread2.start();
        thread3.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        ThreadExtends threadExtends1 = new ThreadExtends();
        ThreadExtends threadExtends2 = new ThreadExtends();
        ThreadExtends threadExtends3 = new ThreadExtends();

        threadExtends1.setName("Thread窗口1");
        threadExtends2.setName("Thread窗口2");
        threadExtends3.setName("Thread窗口3");

        threadExtends1.start();
        threadExtends2.start();
        threadExtends3.start();
    }
}


/*实现Runnable方式*/
class RunnableImp1 implements Runnable{

    private int ticket = 100;
    @Override
    public void run() {
        while(true){
            if(ticket > 0){
                show();
            }else{
                break;
            }
        }
    }

    public synchronized void show(){//此处的synchronized相当于this
        if(ticket > 0){
            System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + ticket);
            ticket--;
        }
    }
}

class ThreadExtends1 extends Thread{
    private static int ticket = 100;
    @Override
    public void run() {
        while(true){
            if(ticket > 0){
                show();
            }else{
                break;
            }
        }
    }
    public static synchronized void show(){//此处的synchronized相当于当前类对象(ThreadExtends1.class)
        if(ticket > 0){
            System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + ticket);
            ticket--;
        }
    }
}

 

标签:Thread,start,安全,解决,new,ticket,多线程,public,ThreadExtends
From: https://www.cnblogs.com/sjzchf/p/17076754.html

相关文章

  • c++多线程调用python
    脚本语言是快速编写富有弹性的代码的重要方法之一,在 Unix 系统自动化管理中已经应用了多种脚本语言。现在,在许多应用开发中,也提供了脚本层,这大大方便用户实现通用任务自......
  • Math.random()的安全风险
    Math.random()函数返回一个0~1之间的伪随机浮点数,其在V8中的实现原理是这样的:为了保证足够的性能,Math.random()随机数并不是实时生成的,而是直接生成一组随机数(64个),并放在......
  • Vue2 常见问题汇总及解决方案
    参考:https://mp.weixin.qq.com/s/6Wapb1bZLQaYv0zlip6ygg1.安装超时(installtimeout)方案:cnpm:国内对npm的镜像版本/*cnpmwebsite:https://npm.taobao.org/......
  • 钢铁安全VR培训系统模拟真实事故现场,带来逼真感官体验
    每当谈及安全生产,总有人避之不及,觉得安全事故很遥远,但事实却告诉我们危险其实无处不在,安全问题必须重视起来。由广州华锐互动制作的钢铁生产3D事故安全警示教育视频,包含钢......
  • springboot~openfeign开启熔断之后MDC为null的解决
    上一篇说了关于MDC跨线程为null的理解,而本讲主要说一下,如何去解决它,事实上,Hystrix为我们留了这个口,我们只需要继承HystrixConcurrencyStrategy,然后重写wrapCallable方法,再......
  • 多线程基础
    ThreadFactory线程工厂生产线程的工厂,newThread是生产线程的方法,可以定义线程的基本特性。(比如优先级、是否守护线程) join调用join方法就会优先执行这个线程(thread1),等......
  • 鼎捷ERP二维码整体解决方案 Tiptop GP条码管理系统 鼎捷ERP移动解决方案 鼎捷条码扫描
    本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案。     最近定制开......
  • rabbitmq启动不起来解决方案
    1,用systemctlstartrabbitmq-server命令启动发现启动不起来2,查看journalctl-xe日志发现1月3015:05:34sit2--10-1-1-97rabbitmq-server[5088]:BOOTFAILED1......
  • 谷歌邮箱无法显示使用 Base64 处理的图片的解决方法
    前言有时候图片会使用Base64编码来处理,然后再传到前端img标签的src属性里展示,这里记录遇到的一个问题,就是使用谷歌邮箱来打开图片,使用了Base64编码处理的图片是展......
  • 【KAWAKO】MNN-1.2.0版本交叉编译遇到的错误与解决方法
    目录在使用gcc-linaro-7.5.0-aarch64-linux-gnu、gcc-linaro-6.3.1-aarch64-linux-gnu交叉编译链对MNN1.2.0进行交叉编译的过程中,make的时候遇到了一个报错。error:can......