day22 java多线程 线程安全问题解决方案

线程安全问题

[面试题]继承Thread和实现Runnable有什么区别?

1.实现接口和继承类 - 实现接口更灵活因为可以多实现。

2.线程安全

        同步代码块 :

                继承Thread : 锁不可以是this

                实现Runnable : 锁可以是this

        同步方法

                继承Thread : 同步方法要使用静态同步方法--锁是当前类的运行时类(类信息)

                实现Runnable : 同步方法不是静态的 - 锁是this

3.共享数据(Thread要创建好几个对象,Runnable的实现类创建对象只用创建溢出)

        继承Thread : 如果共享数据是在Thread子类中声明的该共享数据需要使用static修饰

        实现Runnable : 如果共享数据是在Runnable接口的实现类中声明的共享数据不需要使用static修饰

方案一 :同步代码块

方案一 :同步代码块格式: synchornized(监视器/锁){操作共享数据的代码}
synchronized 关键字可以用于某个区块前面,表示只对这个区块的资源实行互斥访问。 说明:1.监视器/锁是任意类的对象。但是所有的线程用的必须是同一把锁。2.多个线程需要抢锁/监视器 谁抢到谁就执行同步代码块中的内容。其它线程需要等待 等待操作共享数据的线程执行完毕

实现Runable

public class ThreadSafeTest {public static void main(String[] args) {MyRunnable mr = new MyRunnable();new Thread(mr,"窗口1:").start();new Thread(mr,"窗口2:").start();new Thread(mr,"窗口3:").start();}
}class MyRunnable implements Runnable{int ticketNumber = 100;Integer i = 99;@Overridepublic void run() {while (true) {synchronized (this) {  //三个线程用的是同一把锁if (ticketNumber > 0) {System.out.println(Thread.currentThread().getName() + "====" + ticketNumber);ticketNumber--;} else {return;//结束方法 - 结束线程}}}}
}

继承Thread

使用继承Thread方式开启线程
注意:1.共享数据只能有一份。共享数据如果是在类中声明的那么必须用static修饰。2.同步监视器/锁 三个线程必须使用的是同一把。在这如果写this那么this就是三个对象就不对了。
public class ThreadSafeTest2 {public static void main(String[] args) {//创建三个线程new MyThread("窗口1").start();new MyThread("窗口2").start();new MyThread("窗口3").start();}
}class MyThread extends Thread{private static int ticketNumber = 100;//如果不加static三个对象 三个属性public MyThread(String name){super(name);}@Overridepublic void run() {while (true){//同步代码块//不可以写this因为是三个对象 --- MyThread.class当前类的运行时类的对象(类信息)synchronized (MyThread.class) {if (ticketNumber > 0) {System.out.println(Thread.currentThread().getName() + "==" + ticketNumber);ticketNumber--;} else {return;}}}}
}

方案二 :同步方法

格式: [修饰符] synchronized 返回值类型 方法名([形参列表]){ 操作共享数据的代码 }

synchronized 关键字直接修饰方法,表示同一时刻只有一个线程能进入这个方法,其他线程在外面等着。

什么时候线程会死?

1.run方法结束 2.抛异常

实现Runable

同步方法的锁:
            静态方法 : 当前类的运行时类 MyThread.class

public class ThreadSafeTest {public static void main(String[] args) {MyRunnable mr = new MyRunnable();new Thread(mr,"窗口1:").start();new Thread(mr,"窗口2:").start();new Thread(mr,"窗口3:").start();}
}class MyRunnable implements Runnable{int ticketNumber = 100;Integer i = 99;@Overridepublic void run() {while (true) {if(!get()){//get方法的返回值为true说明有票  返回值为false说明没有票了return;//结束线程}}}public synchronized boolean get(){//操作共享数据的代码if (ticketNumber > 0) {System.out.println(Thread.currentThread().getName() + "====" + ticketNumber);ticketNumber--;return true;} else {return false;//说明票卖完了}}
}

继承Thread

同步方法的锁:
            静态方法 : 当前类的运行时类 MyThread.class
            非静态方法 : this

public class ThreadSafeTest2 {public static void main(String[] args) {//创建三个线程new MyThread("窗口1").start();new MyThread("窗口2").start();new MyThread("窗口3").start();}}class MyThread extends Thread{private static int ticketNumber = 100;//如果不加static三个对象 三个属性public MyThread(String name){super(name);}@Overridepublic void run() {while (true){if (!get()){return;//结束线程}}}public static synchronized boolean get(){if (ticketNumber > 0) {System.out.println(Thread.currentThread().getName() + "==" + ticketNumber);ticketNumber--;return true;} else {return false;}}
}

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

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

相关文章

修改taro-ui-vue3的tabs组件源码增加数字标签

需求:taro-ui-vue3的tabs组件上增加数字标记 步骤一:node_modules文件夹下找到taro-ui-vue3/lib/tabs/index.js 把173行的这一段替换成下面这段,然后写上样式 default: () > item.number ? [h(View, {class: at-tabs__item_in}, {defau…

Unity导出package

C#代码导出后为一个dll,原有的不同平台的库不变。 以下操作均在build PC 平台下操作。 1.在要导出的文件夹下建assembly definition (Any platform) 2.将项目文件夹下的\Library\ScriptAssemblies中的相应assembly definition的dll复制到要导出的文件夹下 3.在uni…

gstreamer pad cap的协商

这是在大模型中获取的答案,有点意思。 在 GStreamer 中,大多数时候 pad 协商是通过框架自动完成的,并且不需要手动干预。但是,了解如何在代码里面执行 pad 协商是很有帮助的,这在创建自定义元素或更细致地控制数据流时…

关于Pwn的一些文章

关于Pwn的一些文章 仅仅是本人为了方便查阅资料而已 1、保护机制: https://www.zhihu.com/question/464671097/answer/3257122786https://blog.csdn.net/m0_71081503/article/details/127732602 2、DA常用快捷键及其作用 https://blog.csdn.net/weixin_4574396…

基于Java+SpringBoot+Vue前后端分离仓库管理系统

基于JavaSpringBootVue前后端分离仓库管理系统 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &#…

Vue3基本功能介绍

文章目录 Vue3组件中的模板结构可以没有根标签div组合式APIRefReactive函数回顾Vue2响应式Vue3实现响应式对比reactive和refSetup注意点计算属性与监听computedWatchWatchEffectVue3生命周期自定义hook函数toRef其他组合APIshallowReactiveshallowRefreadonly和shallowOnlyToRa…

算法设计与分析实验4 :利用动态规划的方法解决子集等和分割判断问题

实验4 利用动态规划的方法解决子集等和分割判断问题 一、实验目的 1. 了解动态规划的主要思想。 2. 掌握背包问题解决方法用以解决该问题。 3. 分析核心代码的时间复杂度和空间复杂度。 二、实验内容和要求 题目:给定一个只包含正整数的非空数组。是否可以将这个数组分…

赋能企业高效精准的EDM邮件群发推广

数字化营销日益成为商业增长引擎,云衔科技以其创新的智能EDM(Electronic Direct Mail)邮件群发推广解决方案,帮助企业客户突破传统营销模式,实现业绩飞跃和品牌影响力的大幅提升。 作为数字化广告营销及SaaS软件服务领…

安装mysql5.7.26一个报错问题

首先先安装mysql5.7.26,因为要求安装的版本要和原来的一样,数据路径也要和原来一致 一、安装mysql5.7.26 mysql官网各种版本下载网址 MySQL :: Download MySQL Community Server (Archived Versions) 1、下载mysql安装包 2、环境准备 centos7.9 mysql5.7.26包…

【简单介绍下Faiss原理和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

有哪些公认好用且免费的云渲染网渲平台?渲染100邀请码1a12

现在云渲染是越来越火了,无论是在建筑设计、影视动画还是效果图行业都有它的身影,云渲染能缩短制作周期,提高工作效率,那么市面上有哪些公认好用且免费的云渲染平台呢?这次我们来了解下。 首先,我们来看看有…

Linux:nmcli网络配置

Linux:nmcli网络配置 作用:nmcli,可以实现创建,显示,编辑,删除,激活和停用网络连接以及控制和显示网络设备状态等查看网卡信息(这个在排查网络配置错误时很有用) [root…

牛客Linux高并发服务器开发学习第三天

静态库的使用(libxxx.a) 将lession04的文件复制到lession05中 lib里面一般放库文件 src里面放源文件。 将.c文件转换成可执行程序 gcc main.c -o app main.c当前目录下没有head.h gcc main.c -o app -I ./include 利用-I 和head所在的文件夹,找到head。 main.c…

Redis中的Lua脚本(五)

Lua脚本 脚本复制 复制EVALSHA命令 EVALSHA命令式所有与Lua脚本有关的命令中,复制操作最复杂的一个,因为主服务器与从服务器载入Lua脚本的情况可能有所不同,所以主服务器不能像复制EVAL命令、SCRIPT LOAD命令或者SCRIPT FLUSH命令那样&…

Ubuntu鼠标自动点击脚本-工具xdotool简单使用

1 安装xdotool sudo apt-get install xdotool2 xdotool基本指令 移动鼠标 #设置屏幕位置 x_ 300 y_ 400 xdotool mousemove x_ y_点击鼠标 xdotool mousemove x_ y_ click 1设置动作间隔 #暂停2s sleep 23简单的bash脚本 move_mouse.sh iterations 2000for ((i0; i&l…

CentOS 7 上安装 MySQL 8.0详细步骤

CentOS 7 上安装 MySQL 8.0.30:详细步骤 准备阶段 下载 MySQL 安装包 前往 MySQL Archives,选择适合 CentOS 7 的安装包。 关闭防火墙和 SELinux # 临时关闭防火墙 systemctl stop firewalld.service # 永久关闭防火墙 systemctl disable firewalld.se…

k8s的服务Service暴露应用

k8s的服务Service暴露应用 Kubernetes(k8s)是一个开源的容器编排系统,用于自动化应用部署、扩展和管理。在k8s中,Service是管理Pod访问的关键组件,它允许你定义如何访问运行在集群中的Pod。本文将详细介绍Service的概…

第七节 LLAVA模型训练流程与方法

文章目录 前言一、训练模式方法二、lora形式fitune训练步骤第一步:lora形式fitune的launch.json配置第二步:train_mem.py第三步:模型参数配置(train())第四步:语言模型加载第五步:语言模型梯度、量化、lora训练方法设定第六步:语言模型的tokenizer第七步:根据model_ar…

[大模型]Qwen-7B-Chat 接入langchain搭建知识库助手

Qwen-7B-Chat 接入langchain搭建知识库助手 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置…

河北专升本(c语言各种编程题)

目录 第一类、递归调用 第二类、特殊数字 第三类、多维数组 第四类、字符处理 第五类、数学问题 第六类、排序算法 第七类、循环问题 第八类、进制转换 第九类、实际应用 第十类、图形输出 第一类、递归调用 1.汉诺塔:请输入盘子数,输出盘子移动…