解决线程安全问题的三种方法

2023-10-27

解决线程安全问题的三种方法

一、使用同步代码块

如:卖票案例 出现了线程安全 重复的票不能出现

步骤
成员位置建立锁对象;
synchronized(锁对象){
出现安全问题代码
}

1 锁对象 任意对象
2 必须保证多个线程使用的是同一个锁对象
3 把{} 只让一个线程进

例子:

public class RunnableImpl implements  Runnable{
    // 定义共享资源   线程不安全
    private int ticket = 100;
    //在成员位置创建一个锁对象
    Object obj = new Object();
    // 线程任务  卖票
    @Override
    public void run() {
        while(true){
            //建立锁对象
            synchronized (obj){
                if(ticket>0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //卖票操作
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                    ticket--;
                }
            }
        }
    }
}

二、使用同步方法解决多线程安全

步骤

1 创建一个方法 修饰符添加synchronized
2 把访问了 共享数据的代码放入到方法中
3 调用同步方法

例子

public class RunnableImpl implements  Runnable{
    // 定义共享资源   线程不安全
    private int ticket = 100;
    // 线程任务  卖票
    @Override
    public void run() {
        while(true){
            payTicket();//调用下面synchronized修饰的方法
        }
    }
    public synchronized void payTicket(){
        if(ticket>0){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //卖票操作
            System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
            ticket--;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决线程安全问题的三种方法 的相关文章

  • 【Leetcode刷题】141、环形链表

    原题链接 https leetcode cn problems linked list cycle favorite 2cktkvj 给你一个链表的头节点 head 判断链表中是否有环 如果链表中有某个节点 可以通过连续跟踪 next 指针
  • 软件测试工程师的职责是什么?

    一 测试工程师 1 国内定位和发展前景 测试工程师 软件质量的把关者 工作起点高 发展空间大 我国的软件测试职业还处于一个发展的阶段 所以测试工程师具有较大发展前景 目前传统的软件行业还是以软件测试工程师为主 但是在新兴的互联网行业大多还是
  • Rider For Unreal 常用快捷键与基础操作整理

    相较于VS常用快捷键 整理一下Rider中目前比較常用的快捷鍵 欢迎私信或评论补充 确实常用的話我會立即加上 小白级操作指导 操作 快捷鍵 编译 Ctrl F9 编译並运行 Shift F10 快速切换声明与实现 Ctrl B 快速添加所需
  • git上传大文件

    注意 免费版的 Gitee 不支持 LFS 需要企业版账户 下载一个git lfs 插件 官网 https git lfs github com 安装路径一定要注意 你的本地 Git 目录下的 bin 以我为例 D Porgram IT G
  • ngix反向代理配置(长连接)

    各位有没有遇到 一般的代理服务器 在运行程序时候 经常会出现服务器连接不上的问题 问题的原因 是代理服务器没有配置长连接 下文就是小编为了解决此问题 通过使用nginx配置做一个代理的中转 跳转到外部的计算机上 场景是小编有一台a计算机 b
  • 程序员修炼之道:从小工到专家九月第一篇

    这半个多月 从老师介绍给我们这本书之后 我在网上又读了写别人的体验与感受 感觉收益颇丰 我虽然刚开始读 但是里面有一些名言警句感觉和我们练习的十分紧密 第一句呢就是你说什么和你怎么做同等重要 这是从别人那看来的 书上写道 如果你不能有效的向
  • sklearn.metrics【指标】

    分类指标 1 accuracy score y true y pre 精度 2 auc x y reorder False ROC曲线下的面积 较大的AUC代表了较好的performance 3 average precision scor
  • (进制,类型)This指向

    进制 类型 This指向 进制 类型 this js中属性名key this key window key 题目练习 题 new this指向补充 进制 类型 数字类型number 布尔类型boolean 字符串类型string undef
  • 在Windows10系统配置WSL

    前言废话 在电脑上需要LINUX开发的时候 由于虚拟机无法直接连接到电脑主机的显卡 无法在LINUX上进行CUDA编程 所以如果需要在该电脑进行LINUX的CUDA开发 配置一个wsl就显得十分重要 本次配置是在一台 刚装过vs c 和CU
  • 优惠券列表 crmeb开发api接口文档

    优惠券列表 基本信息 Path api coupons Method GET 接口描述 请求参数 Query 参数名称 是否必须 示例 备注 page 否 分页参数起始值 limit 否 分页数步长值 type 否 0 所有优惠券 默认 1
  • mvn 手动编译jar包 为pom依赖

    mvn install install file Dfile upload jar DgroupId com qiniu util DartifactId upload Dversion 1 0 Dpackaging jar Dgenera
  • 【面经】华为OD软件测试

    本人山东双非一本 二战失利后参加工作 面试时参考了网上很多面经 前人栽树后人乘凉 写一下自己的面试经历 2 16 机试 总分400 两道简单题各100分 一道中等题200分 每题按照通过样例百分比计分 150分通过 建议尽可能多拿分 可能会
  • 2003服务器怎么修改域,如何降级Windows 2003 server域控制器

    1 单击开始 单击运行键入 dcpromo 然后单击确定 2 这样就启动了 Active Directory 安装向导 单击下一步 3 删除 Active Directory 屏幕上有一个复选框 如果此计算机是域中的最后一个域控制器 则请单
  • 解决 Plugin [id: ‘com.android.application‘, version: ‘x.x.x‘, apply: false] was not found ......

    步骤一 查看一下你的gradle对应的JDK版本是否过低 目前8 0版本对应的是JDK17 步骤二 如果是下载失败 可以在settings gradle中的添加镜像地址 以下是我的项目中的例子 pluginManagement reposi
  • word2vec

    import pandas as pd import json import jieba import gensim from gensim models word2vec import LineSentence from gensim m
  • TCP/IP SOCKET HTTP

    网络七层由下往上分别为物理层 数据链路层 网络层 传输层 会话层 表示层和应用层 其中物理层 数据链路层和网络层通常被称作媒体层 是网络工程师所研究的对象 传输层 会话层 表示层和应用层则被称作主机层 是用户所面向和关心的内容 http协议
  • ① 尚品汇的前台开发笔记【尚硅谷】【Vue】

    文章目录 一 采用vue cli去初始化项目 二 项目的其他配置 三 项目路由的分析 四 完成非路由组件Header与Footer业务 开发项目的步骤 使用组件的步骤 非路由组件 完成路由组件的搭建 Footer组件显示与隐藏 路由传参 路
  • JSON是什么呢?

    写这篇文章的缘由 你了解JSON嘛 JSON是JavaScript中对象嘛 JSON可以存储function对象嘛 JSON的本质是什么呢 JSON能写注释嘛 如果你都能答上来 那恭喜你 你对JSON了解的很测底 如果你有写不太明白 哪有必
  • 图书管理系统【C++】

    图书借阅管理系统 C 文章目录 图书借阅管理系统 C 一 需求分析 二 程序主要功能 三 程序运行平台 四 程序框架 五 文件说明 六 程序代码 七 使用展示 1 开始运行 2 读者系统 3 图书系统 4 借书还书 八 后记 一 需求分析

随机推荐

  • Wwise指引贴

    几种音频软件的比较 Criware音频引擎跟Wwise在功能上有什么直接的区别么 为什么很多大厂都选择Wwise
  • 关系型数据库ACID与非关系型数据的CAP

    ACID 事务的原子性 Atomicity 是指一个事务要么全部执行 要么不执行 也就是说一个事务不可能只执行了一半就停止了 比如你从取款机取钱 这个事务可以分成两个步骤 1划卡 2出钱 不可能划了卡 而钱却没出来 这两步必须同时完成 要么
  • 剑指Offer - 面试题23:链表中环的入口节点

    题目 如果一个链表中包含环 如何找出环的入口节点 例如 在下图中的链表中 环的入口节点是节点3 分析 将这个问题解剖开 分为俩步 判断是否有环 有环再找入口节点 第一个问题 我们用快慢指针来判断 只要相遇就有环 快指针走到头就是没有环 第二
  • JS中Date()和New Date()的区别

    最近用日期控件用的比较多 所以说一说Date 和New Date 之间的区别 var c 1 Date 返回一个字符串 string 没有getDate等日期对象方法 内容为当前时间 var c2 new Date 返回一日期对象 可以调用
  • 生成性对抗网络(GAN) 和styleGan

    生成性对抗网络 GAN 是机器学习中一个相对较新的概念 于2014年首次引入 他们的目标是合成与真实图像无法区分的人工样本 如图像 GAN应用程序的一个常见示例是通过从名人面孔数据集学习来生成人造人脸图像 随着时间的推移 GAN图像变得更加
  • C#面试题

    1 维护数据库的完整性 一致性 你喜欢用触发器还是自写业务逻辑 为什么 答 尽可能用约束 包括CHECK 主键 唯一键 外键 非空字段 实现 这种方式的效率最好 其次用触发器 这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性
  • telnet传输文件:telnet登录Linux后通过busybox ftpget获取远程文件

    telnet传输文件 telnet登录Linux后通过busybox ftpget获取远程文件 文章目录 telnet传输文件 telnet登录Linux后通过busybox ftpget获取远程文件 1 场景 2 telnet登录 3 b
  • 【TIP】已经上架的app在AppStore上搜不到的解决办法

    appstore上架后搜不到APP 修改定价 将你的app定价修改成0 99刀 修改你的发行范围 全取消后只选中国 save 这时候你的app status将会变成pending contract 将之前的修改都改回来 修改定价free 全
  • Mac系统下Android studio配置环境变量(ADB、JDK、GRADLE、Flutter)

    mac os 启动台 gt 终端 进入当前用户的home目录 默认 cd 若 bash profile文件不存在则创建 touch bashrc 名字可以自己定义 bash profile 打开 bash profile 文件不存在则创建则
  • 第六章 系统总线

    http eduunix ccut edu cn index2 edu C7 E5 BB AA B4 F3 D1 A7 BC C6 CB E3 BB FA BF CE B3 CC CE A2 D0 CD BC C6 CB E3 BB FA
  • 阿里P8精心整理的微服务系统架构设计手册,一睹微服务架构世界

    近几年 微服务架构在大量技术社区迅速蹿红 被认为是 IT 软件架构的未来方向 一线互联网公司由于具有大量的业务体量和业务场景 比如阿里 百度 网易 很早就开始入坑微服务架构 随着云端办公以来 发现微服务越来越重要了 Docker 容器技术和
  • MatConvNet:3.代码(一)cnn_mnist.m注释

    原文链接 https blog csdn net qq 20259459 article details 54411178 博主博客地址 http blog csdn net qq 20259459 作者邮箱 jinweizhi93 gma
  • 用函数完成两个数相加(用两个方法实现)

    用函数完成两个数相加 1 方法一 int f1 int x int y 声明函数 定义函数 int z z x y return z include
  • JAVA 敏感词过滤

    package me mymilkbottles import org apache commons lang CharUtils import java io File import java util HashMap import ja
  • 基于vue+leaflet+echart的足迹分享评论平台

    其实题目是随便取的 目的只是用来证明Vue leaflet springboot技术栈的可行性 效果 小专栏不支持上传视频 想看的话可以去我的知乎看最新的文章 那个应该可以 在这里 主要功能描述 vue leaflet结合 足迹管理 新建
  • python编程-2.编写程序,输出所有由1,2,3,4这四个数字组成的素数,并且每个数字在素数中只出现一次。

    data用于存储在一定范围内的素数 data set for n in range 1234 4321 1 if n 2 0 continue for i in range 3 int n 0 5 1 2 if n i 0 break el
  • 组合逻辑电路——编码器

    组合逻辑电路 编码器 概念 编码的概念 在数字系统中 常需要将有特定意义的信息编成二进制代码 这一过程称为编码 编码器 实现编码的数字电路被称为编码器 二进制编码器 这里我们采用与非门来设计二进制编码器 二进制编码器输出端数量不定 可以根据
  • ACM MM 2022

    有预训练 460多m 来源丨https zhuanlan zhihu com p 547671620 Bidirectional Self Training with Multiple Anisotropic Prototypes for
  • Glide使用及原理分析

    文章目录 前言 一 Glide的基本使用 二 Glide的网络请求 1 HttpURLConnection实现一个原生图片加载框架 2 Glide为什么能监听网络变化 三 Glide的生命周期 1 Fragment的生命周期 动态加载Fra
  • 解决线程安全问题的三种方法

    解决线程安全问题的三种方法 一 使用同步代码块 如 卖票案例 出现了线程安全 重复的票不能出现 步骤 成员位置建立锁对象 synchronized 锁对象 出现安全问题代码 1 锁对象 任意对象 2 必须保证多个线程使用的是同一个锁对象 3