Java学习629

news2024/12/30 2:04:42

线程安全

开发中银行排号,火车售票系统中多线程程序发生的问题

引入代码:

package Test0626;


class SaleTicket implements Runnable{
    int ticket = 100;
    @Override
    public void run() {
        while(true){
            if (ticket > 0){
                System.out.println(Thread.currentThread().getName()+"售价,票号:"+ticket);
                ticket--;
            }else {
                break;
            }
        }
    }
}
public class WindowTest {
    public static void main(String[] args) {
        SaleTicket s = new SaleTicket();

        Thread t1 = new Thread(s);
        Thread t2 = new Thread(s);
        Thread t3 = new Thread(s);

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

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

 

结果中:

出现重复票号;

线程的安全问题与线程的同步机制

1.多线程卖票,出现的问题:出现了重票和错票

2,什么原因导致的?线程1操作ticket的过程中,尚未结束的情况下,其他线程也参与进来,对ticket进行操作。

3.如何解决?必须保证一个线程a在操作ticket的过程中,其它线程必须等待,直到线程a操作ticket结束以后,其它线程才可以进来继续操作ticket。

4.Java是如何解决线程的安全问题的?使用线程的同步机制。

方式1:同步代码块

Synchronized(同步监视器){

//需要被同步的代码

}

说明:

>需要被同步的代码,即为操作共享数据的代码。

>共享数据:即多个线程多需要操作的数据。比如: ticket

>需要被同步的代码,在被synchronized包裹以后,就使得一个线程在操作这些代码的过程中,其它线程必须等待。

>同步监视器,俗称锁。哪个线程获取了锁,哪个线程就能执行需要被同步的代码。

>同步监视器,可以使用任何一个类的对象充当。但是,多个线程必须共用同一个同步监视器.

注意:

>在实现Runnable接口的方式中,同步监视器可以考虑使用: this。

>在继承Thread类的方式中,同步监视器要慎用this。可以考虑使用:当前类.class

方式2:同步方法

说明:

>如果操作共享数据的代码完整的声明在了一个方法中,那么我们就可以将此方法声明为同步方法即可

>非静态的同步方法,默认同步监视器是this

>静态的同步方法,默认同步监视器是当前类本身。

5.synchronized好处:解决了线程的安全问题。

弊端,在操作共享数据时,多线程其实是串行执行的,意味着性能低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS2 launch文件同时引入yaml文件参数和自定义变量参数

0 背景 在ROS中,launch工具可以帮助用户同时启动多个节点,以及引入多种设置如参数导入、节点名重映射等。在ROS1中,launch文件通过xml语言编写,后缀名为.launch;而ROS2在xml的基础上(后缀名为.xml&#xf…

【Servlet学习四】实现一个内存版本的表白墙~

目录 一、前端代码 二、后端代码实现 🌈1、全局类定义AppVar 🌈2、实体类定义Message 🌈3、获取所有信息:getMessageServlet实现前后端的交互 🌈4、添加数据:addMessageServlet,实现前后端…

notepad++去除换行符和空格

在notepad中按Ctrlh 1.去除换行符 输入如图所示的查找内容为\r\n,【替换为】不填写,勾选底部的【正则表达式】,然后点击【全部替换】 2. 按照逗号换行 输入如图所示的查找内容为,,【替换为】\r\n,勾选底部的【正则…

C# WinForm 选择打开文件和保存文件

做 winform 项目的时候正好遇到了记录一下: 打开文件 我们使用 OpenFileDialog 控件来打开文件选择框: 通过 Title 属性可以设置选择框的标题而 Filter 属性可以设置选中的文件类型,这个属性由两个部分组成 SVG files (*.svg)|*.svg &am…

九、云尚办公系统-管理端-审批管理

云尚办公系统:管理端-审批管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!…

Unity导出到AS中真机测试apk没有问题,aab提交到GooglePlay审核通过,但是从Google Play下载的应用闪退问题

从Google Play下载的应用报错如下: backtrace: #00 pc 0x0000000000050748 /data/app/~~x94h_Fmdoj4Vj1NVQcL7sQ/com.id.hhhuhi-LpC7BJqILn3X29R8TffhuA/split_config.arm64_v8a.apk!libpairipcore.so (ExecuteProgram196) 06-26 20:39:40.526 13936 13936 F l…

基于Java+Vue前后端分离宠物领养系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

ML@集成学习@摘要

文章目录 集成学习refs摘要Note准确性和多样性 集成学习方法分类BoostingAdaBoost伪代码Adaboost小结 补充补充1补充2 BaggingBagging伪代码 特点算法效率直接应用于多分类 自助采样和包外估计随机森林 Stackingsklearn中的Stacking🎈构造初级学习器构造次级学习器 …

Ubuntu18.04 系统设置修改物理内存-迅为RK3568开发板

打开虚拟机,如下图。单击红色框中的“虚拟机”。如下图所示: 然后点击“设置”弹出虚拟机的设置界面,如下图所示: 更多教程B站搜:迅为3568开发板

RHEL8.2安装QEMU及KVM虚拟化

一、环境 操作系统:CentOS8.2CPU:4C内存:16G磁盘:250G,其中180G分配给/data,用于存储数据及kvm存储池。 二、安装步骤 dnf module install virt dnf install virt-install virt-viewer virt-manager -y三…

【Redis二】Redis优化之持久化

Redis优化之持久化 1.Redis高可用2.Redis持久化2.1 RDB 持久化2.1.1 触发条件2.1.2 执行流程2.1.3 启动时加载 2.2 AOF 持久化2.2.1 开启AOF2.2.2 执行流程2.2.3 文件重写触发方式2.2.4 文件重写的流程2.2.5 启动时加载 2.3 RDB和AOF的优缺点2.4 RDB AOF持久化的区别 3.Redis性…

如何理解 Istio Ingress, 它与 API Gateway 有什么区别?东西流量?南北流量?

文章目录 背景k8s的内部服务如何被外部访问东西流量南北流量流量管理的比较 IngressAPI GatewayIstio参考 背景 这三者都和流量治理密切相关,那么流量治理在过去和现在有什么区别呢?都是如何做的呢? 在学习istio的时候对流量管理加深了理解。…

学编程c++有什么好处?有什么作用?

C是一种跨平台、高效且广泛应用的编程语言,具有许多优势和应用领域。本文将深入探讨学习C编程的好处,包括跨平台性、高效性、对系统资源的控制能力以及面向对象编程的优势。此外,我们还将介绍C在不同领域的应用,如桌面应用程序、嵌…

记录好项目D17

记录好项目 你好呀,这里是我专门记录一下从某些地方收集起来的项目,对项目修改,进行添砖加瓦,变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个SpringBoot网上商城 一、系统介绍 前台功能 商品分类查询&#xff…

【微服务架构】微服务安全 - 如何保护您的微服务基础架构?

在当今行业使用各种软件架构和应用程序的市场中,几乎不可能感觉到您的数据是完全安全的。因此,在使用微服务架构构建应用程序时,安全问题变得更加重要,因为各个服务相互之间以及客户端之间进行通信。因此,在这篇关于微…

STM32F407实现NEC协议红外线解码

【1】NEC红外线协议介绍 NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该协议定义了红外线通信的物理层和数据链路层规范,以实现可靠的红外线数据传输。 下面是NEC红外线协议的详细…

Linux下用who命令查看当前登录用户

文章目录 1 查看当前登录用户(w 和 who)2 who命令查看某一时刻登录的用户3 查看当前登录用户的账户名(whoami)4 关于linux下who指令的总结介绍 1 查看当前登录用户(w 和 who) w命令可以查看某一时刻登录该…

《深入浅出SSD:固态存储核心技术、原理与实战》----学习记录(二)

第2章 SSD主控和全闪存阵列 SSD主要由两大模块构成——主控和闪存介质。其实除了上述两大模块外,可选的还有缓存单元。主控是SSD的大脑,承担着指挥、运算和协调的作用,具体表现在:一是实现标准主机接口与主机通信;二…

短视频seo矩阵+抖音小程序SaaS源码开发部署

短视频seo矩阵开发者综述 短视频seo主要基于抖音短视频平台,为企业实现多账号管理,视频分发,视频批量剪辑,抖音小程序搭建,企业私域转化等,本文主要介绍短视频矩阵系统抖音小程序开发详细及注意事项 抖音小…

VC++6.0实现MFC单文档模拟交通灯

要求: 模拟交通灯: (1)建立一个单文档应用项目(项目名称为学生姓名拼音首字母缩写)。 (2)修改它的图标和版本信息。 (3)为该应用项目添加两个按钮到工具…