java不同进程的相互唤醒_Java多线程(二)同步与等待唤醒

1:数据安全问题

1.1:什么情况下会出现数据安全问题?

多个线程对同一个资源进行操作,并且操作资源的语句有多条。那么这个时候这些语句因为cpu的随机性,有可能被多个线程分开执行。导致数据安全问题。

例子:有3个人分别是你爸、你妈妈、你姐,去你的一个账户汇钱给你,每一个只能存3次,一次只能存100元。每存一次,请打显示出账户里的余额。代码体现:

1 public classSaveMoneyDemo1 {2

3 public static voidmain(String[] args) {4 SaveDemo1 s = newSaveDemo1();5 Thread t1 = newThread(s);6 t1.setName("老爸");7 Thread t2 = newThread(s);8 t2.setName("老妈");9 Thread t3 = newThread(s);10 t3.setName("姐姐");11 t1.start();12 t2.start();13 t3.start();14 }15

16 }17

18 class SaveDemo1 implementsRunnable{19 private int sum = 0;20 //要执行的代码块放在run方法里面。

21 public voidrun() {22 //每个人能存三次,就是循环三遍

23 for(int i=0; i<3; i++){24 sum+=100;25 System.out.println(Thread.currentThread().getName()+"给你汇了100,目前账号共有 "+sum+" 元");26

27 }28 }29 }30 /**

31 * 执行结果:32 老妈给你汇了100,目前账号共有 200 元33 老妈给你汇了100,目前账号共有 400 元34 老妈给你汇了100,目前账号共有 500 元35 姐姐给你汇了100,目前账号共有 300 元36 姐姐给你汇了100,目前账号共有 600 元37 姐姐给你汇了100,目前账号共有 700 元38 老爸给你汇了100,目前账号共有 200 元39 老爸给你汇了100,目前账号共有 800 元40 老爸给你汇了100,目前账号共有 900 元41 *42 */

没有同步的汇款代码

运行结果好喜感。为什么会出现这种情况?分析:这三人存款是不需按照顺序和次数的,反正帮你存够三次就行了,所以用多线程更为合理。可是,打个比方:当你妈妈在存钱的时候钱是存进去了,在没来得及显示余额的时候你爸正好也把钱存了进去,这时候总金额连同你妈和你爸的加在一起了!所以显示出的金额会发生这样的情况。那么如何解决类似的情况呢?这就要限定一个人存一次就先把金额加上,不能让多人存完之后再一起加,如果这样那金额的显示就乱套了。这时候就要使用同步机制了。

1.2:解决方案: 同步机制

1.2.1:同步代码块。

synchronized(锁){//锁可以为任意对象。但是需要保证多个线程用的是同一把锁。

对同一个资源的操作语句。

}

1.2.2:同步方法的锁:

2.1:同步方法-----this

2.2:静态同步方法-----字节码文件对象。类名.class

1 public classSaveMoneyDemo2 {2

3 public static voidmain(String[] args) {4 SaveDemo2 s = newSaveDemo2();5 Thread t1 = newThread(s);6 t1.setName("老爸");7 Thread t2 = newThread(s);8 t2.setName("老妈");9 Thread t3 = newThread(s);10 t3.setName("姐姐");11 t1.start();12 t2.start();13 t3.start();14 }15

16 }17

18 class SaveDemo2 implementsRunnable{19 private int sum = 0;20 //要执行的代码块放在run方法里面。

21 public voidrun() {22 //每个人能存三次,就是循环三遍

23 synchronized(this){24 for(int i=0; i<3; i++){25 sum+=100;26 System.out.println(Thread.currentThread().getName()+"给你汇了100,目前账号共有 "+sum+" 元");27 }28 }29 }30 }

使用同步的数据安全的汇款

1.3:如果加了同步,还出现数据安全问题,如何排查?

1.3.1:是否为同一把锁

1.3.2:访问资源的多条语句是否在同步中。

1.4:关于同步的拙劣理解:一件事先一口气做完!不让别人插手。(好像太牵强了)

2:死锁问题——互不释放资源(互相等待资源)

2.1  需求:用程序来描述以下情况:一手交钱一手交货。商家与顾客两人都是很小气的人,顾客买商家的东西,商家收顾客的前,顾客说:先给我货我再给你钱;商家说:先给我钱我再给你货。最好的结局就是各自得到各自的东西。

2.2  分析:对于商家和客户来说和他们俩有关的不是钱就是货,而限制这两人的也就是钱和货。这样一来钱和货就可以看做是程序中的两个锁了。造成死锁的原因:同步代码嵌套!在平时开发时应避免同步嵌套!

1 public classDeadLockDemo1 {2 public static voidmain(String[] args) {3 Thread t1 = newCustomer1();4 Thread t2 = newSeller1();5 t1.start();6 t2.start();7 }8 }9

10 class Customer1 extendsThread{11 public static Object money = newObject();12 @Override13 public voidrun() {14 //客户有钱

15 synchronized(money){16 System.out.println("客户等商家给货");17 //客户等货

18 synchronized(Seller1.goods) {19 System.out.println("客户给商家钱");20 }21 }22 }23 }24

25 class Seller1 extendsThread{26 public static Object goods = newObject();27 @Override28 public voidrun() {29 //商家有货

30 synchronized(goods) {31 System.out.println("商家等客户给钱");32 //商家等钱

33 synchronized(Customer1.money) {34 System.out.println("商家给客户货");35 }36 }37 }38 }39

40 /**

41 * 如果想结果暴露地更明显,可以使用sleep()方法42 * 运行死锁的结果:43 * 客户等商家给货44 * 商家等客户给钱45 *46 */

死锁示例代码

3:等待唤醒机制。

前面多个线程案例中,每个线程执行的操作是一样的。如果线程所执行的操作不一样呢?比如一个线程负责生产产品,另外一个线程负责消费产品。

3.1:创建2个线程,2个线程的动作是不一样。比如说:一个生产者和一个消费者。

需求:生产者生产一个产品。消费者消费一个产品。这就涉及到了等待唤醒机制。当生产者生产一个产品后进入等待模式等待消费者来消费这个产品,当消费者消费了这个产品,发现没有产品了,消费者等待,叫生产者生产产品。生产者生产了产品则通知消费者。这就涉及到等待唤醒机制。

3.2:等待唤醒机制。

等待唤醒机制必须是在同步中进行,因为等待和唤醒都是要通过锁来操作的,查看API就是的,wait()和notify()是属于Object的方法,任何对象都是可以作为锁的。

wait:让当前线程等待。在哪里等待的就在哪里醒过来。

notify() :唤醒其中一个等待的线程。

notifyAll():唤醒所有等待的线程

wait和sleep的区别:

1:sleep会拥有锁,而wait会释放锁。

2:sleep睡眠的时间是固定的,而wait等待的时间是不固定的。

3:sleep可以放在同步中,也可以不放在同步中。wait方法必须放在同步中。

3.3:一个生产者和一个消费者的代码实现

1 /*

2 * 生产者生产一个产品。3 * 消费者消费一个产品。4 * 生产者可以生产多个产品,但是一次只能生产一个产品。消费了才能生产。5 * 消费者可以消费多个产品。但是一次只能消费一个 产品。生产有了产品才能消费。6 */

7 public classProCusDemo1 {8 public static Object lock = new Object();//创建一个对象作为锁

9 public static int num = 0;//产品数

10 public static voidmain(String[] args) {11 Pro pro = newPro();12 Cus cus = newCus();13 pro.start();14 cus.start();15 }16

17 }18

19 class Pro extendsThread {20 @Override21 public voidrun() {22 //不断生产,使用循环

23 while(true){24 try{25 Thread.sleep(100);26 } catch(InterruptedException e1) {27 //TODO Auto-generated catch block

28 e1.printStackTrace();29 }30 //System.out.println("111");31 //操作同一数据——产品数(num),使用同步代码块,也可以是等待唤醒机制必须在同步在同步中进行

32 synchronized(ProCusDemo1.lock) {33 //当有一个产品了,生产者就不用生产了

34 if(ProCusDemo1.num == 1){35 try{36 //不用生产的体现就是等待

37 ProCusDemo1.lock.wait();38 //System.out.println("222");

39 } catch(InterruptedException e) {40 e.printStackTrace();41 }42 }43 ProCusDemo1.num ++;//生产了一个产品

44 System.out.println("生产者生产了一个产品,现有:"+ProCusDemo1.num+" 个");45 //当生产了一个产品之后就可以唤醒消费者消费了

46 ProCusDemo1.lock.notify();47 }48 }49 }50 }51

52 class Cus extendsThread {53 @Override54 public voidrun() {55 while(true){56 //System.out.println("333");

57 try{58 Thread.sleep(100);59 } catch(InterruptedException e1) {60 //TODO Auto-generated catch block

61 e1.printStackTrace();62 }63 //多个线程操作同一数据使用同步

64 synchronized(ProCusDemo1.lock) {65 if(ProCusDemo1.num == 0){66 try{67 ProCusDemo1.lock.wait();68 //System.out.println("444");

69 } catch(InterruptedException e) {70 e.printStackTrace();71 }72 }73 ProCusDemo1.num--;74 System.out.println("消费者消费了一个产品,现有:"+ProCusDemo1.num+" 个");75 ProCusDemo1.lock.notify();76 }77 }78

79 }80 }

等待唤醒机制——生产消费

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

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

相关文章

苏州宾馆管理也计算机哪个学校好,苏州十大寄宿式中学学校排名榜

教师的素质目标是什么*的发展离不开教育&#xff0c;教育的发展离不开教师&#xff0c;教师的素质提高关系着民族的未来&#xff0c;教师不仅要教授知识&#xff0c;更重要的是教授做人&#xff0c;以下是小编为您整理的教师的素质目标是什么的相关内容。素质教育目标是提高国民…

aop注解配置切点 spring_Spring通过自定义注解灵活配置AOP切点

package com.lsz.config.enums;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** 加载配置注解** author lishuzhen* date 2020/11/4 11:22*/Target(Ele…

电大计算机网考上机操作题,电大计算机上机考试模拟题及答案 (1)

模拟试题模拟试题一:第001题:在Windows中添加”传真服务”.第002题:设置Internet Explorer,对所有官方微软网站不进行安全认证.操作步骤第003题:设置Outlook Express,新邮件.新闻邮件下载5天后即被删除, 当浪费的空间达到40%时压缩邮件&#xff0c;并将存储在C盘DDKS根目录下。…

python中哪个符号用于从包中导入模块__学小易找答案

【简答题】7个积分题【单选题】5. Is it time for the meeting now?【单选题】result lambda x: x * x print(result(5)) 以上代码输出结果为?【其它】第一次作业.docx【简答题】11个求导题!【单选题】18. Where does the woman want to work?【单选题】15. Where does the…

在职人员计算机网络管理总结,关于学校网络管理员个人工作总结

关于学校网络管理员个人工作总结主要工作职责1.按照规定流程开通校园网用户&#xff0c;做好审核与登记工作。2.接听办公室报修电话&#xff0c;负责校园网网络故障报修用户信息登记。3.凭证参加网络故障现场维护(自网络故障报修日起两个工作日内)。4.统计当天网络故障报修数据…

long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)

在我们平时的工作中&#xff0c;查询列表在我们的系统中基本随处可见&#xff0c;那么我们如何使用jpa进行多条件查询以及查询列表分页呢&#xff1f;下面我将介绍两种多条件查询方式。1、引入起步依赖org.springframework.bootspring-boot-starter-weborg.springframework.boo…

小学计算机课程评价,小学信息技术课堂评价浅谈

小学信息技术是一门融知识性、趣味性和技能性于一体的学科&#xff0c;它着重于对小学生进行初步的信息意识、信息素养和信息技能的培养&#xff0c;集知识性和技能性于一体。而对于学生学习情况的评价&#xff0c;信息技术学科不像其他学科一样&#xff0c;可以留有课后作业或…

git 相同commit_Git 合并多次 commit 、 删除某次 commit

Git 合并多次 commit有时候在一个分支的多次意义相近的 commit&#xff0c;会把整个提交历史搞得很混乱&#xff0c;此时可以将一部分的 commit 合并为一个 commit&#xff0c;以美化整个 commit 历史&#xff0c;可以使用 rebase 的方法来合并多次 commit&#xff0c;主要步骤…

微服务 松耦合_超值干货:微服务架构下如何解耦,对于已经紧耦合下如何重构?...

今天准备谈下微服务架构下各个微服务间如何解耦&#xff0c;以及对于已经紧耦合的微服务如何进行重构。要明白实际上微服务后续出现的诸多问题往往都是一开始微服务模块划分就不合理导致&#xff0c;对于具体的模块划分方法和原则&#xff0c;我总结出了以下几点。原则1&#x…

西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院导师信息情况...

研究生考试招生以下是所有导师的详细资料姓名 权义宁 杨世勇 刘志镜 冯大政 王宇平 王宇平 马建峰职称 副教授 副教授 教授 教授 教授 教授 教授导师类别 硕士生导师 硕士生导师 博士生导师 博士生导师 博士生导师 硕士生导师 博士生导师电子信箱ynquanhttp://doc.xuehai.netsh…

增量式pid调节方式有何优点_增量式pid和位置式pid相比各有什么优缺点

展开全部位置PID和增量PID之间的差异是不同的输出&#xff0c;是否存在积分部分以及是否具有记忆功62616964757a686964616fe78988e69d8331333433626562能。1.输出不同&#xff1a;位置PID控制的输出与整个过去状态有关&#xff0c;并且使用了误差的累加值&#xff1b;而增量PID…

文件夹 计算机无法使用,电脑文件夹提示被使用无法删除怎么办

相信有朋友碰到过这样的问题&#xff0c;电脑上新建一个临时文件夹在使用完后进行删除&#xff0c;或者卸载某一个程序&#xff0c;在卸载完想手动删除残留的文件夹时&#xff0c;出现了下图所示的提示&#xff1a;这个时候我们一般都会在任务管理器中查找是哪个进程占用了&…

python之异常处理_Python之异常处理

异常对象请大家运行如下代码a 100/0print(a)就会发现解释器显示如下的错误提示Traceback (most recent call last): File "xxxxxxxxxx.py", line 1, in a 100/0ZeroDivisionError: division by zero大家要学会看解释器的报错。这就是解释器向我们报告&#xff0c; …

西安北苑附近哪有计算机学校,太古城北(北苑地铁站)附近大学院校

最佳答案&#xff1a;太古城北(北苑地铁站)附近有长安大学-团委,长安大学渭水校区,长安大学计算机实验教学中心,陕西科技大学化学与化工学院,陕西科技大学实验楼1A,陕西科技大学实验楼2A,陕西科技大学-工程训练中心,陕西科技大学管理学院,陕西科技大学西安校区,陕西科技大学信息…

http://www.od85c.com.cn/html/,OllyDbg script for unpacking Enigma 4.xx and 5.xx

[Asm] 纯文本查看 复制代码// Enigma Protector 4.xx and 5.XX unpacker by GIV (some parts are from LCF-AT Alternativ 1.1 script and the API fix is from SHADOW_UA script)// January 22 2016// givreversing.ro// PRIVATE// 3D00F000007E13B800000100 - API COMPARE AN…

hive 神盾特工局_《神盾局特工》第三季剧终惊人:两位超高人气的角色离开

原标题&#xff1a;《神盾局特工》第三季剧终惊人:两位超高人气的角色离开当“神盾局特工”几周前宣布一位主要角色将在本季最后一集中死亡时&#xff0c;粉丝开始猜测这个角色将会是谁。当一切真相揭开时&#xff0c;此剧对于“升天”这个词的承诺竟然有双重意义&#xff0c;第…

计算机软件著作权特征,计算机软件著作权的法律特征是什么

计算机软件著作权的法律特征是什么一、权利内容的法定性法定性有狭义、广义之分。作为一个法律概念的“权利”&#xff0c;都是由国家的法律所规定的&#xff0c;不存在任何法律规定之外的权利&#xff0c;譬如没有所谓“天赋”的权利。从这个意义上讲&#xff0c;凡法律上的权…

html img和背景图处理图片不拉伸_css 背景图不拉伸自适应屏幕大小

效果图全屏&#xff1a;背景图尺寸大于屏幕尺寸&#xff0c;背景图只显示跟屏幕一样大小内容小屏时&#xff1a;如效果图所示&#xff0c;图片并没有发生压缩、或者缩小比例&#xff0c;它只是显示跟屏幕尺寸大小的内容&#xff0c;至于如何控制缩小浏览器时图片的变化&#xf…

2017计算机基本配置检测表,2017整理如何查看电脑的硬件配置信息?查看电脑硬件配.ppt...

2017整理如何查看电脑的硬件配置信息&#xff1f;查看电脑硬件配如何查看电脑的硬件配置信息&#xff1f;查看电脑硬件配 如何查看电脑的硬件配置信息&#xff1f;查看电脑硬件配置信息的方法 电脑培训 n9byl电脑的配置如何看呢?很多没有什么电脑基础的人是一个大的问题,有不少…

棒棒糖球球机器人_球球大作战刷棒棒糖_球球大作战刷龙蛋攻略

玩过球球大作战的玩家们都知道我们要获得棒棒糖和龙蛋是很不容易的&#xff0c;那么游戏中我们要怎么免费获得龙蛋和棒棒糖呢&#xff0c;而通过怎么才能快速获得龙蛋和棒棒糖&#xff0c;同时通过刷的方式要怎么操作呢&#xff0c;接下来就由小编一起来详细给大家介绍吧。游戏…