软件构造学习笔记-第十四周、十五周

课程进入了尾声。本周内容主要是线程安全相关。线程错误比一般的错误更加难以发现和修改,甚至加入一条print语句就能改变时间分片,从而导致错误消失。重点介绍了“锁”的机制,在使用时避免对整个方法进行lock,而是对可能发生线程不安全的指令进行lock操作,以免程序性能受到明显影响。同时避免“死锁”现象发生,在使用多个lock时注意顺序。

并发

1.并行:将程序布置在多个CPU上执行。
并发:将任务拆分为多个阶段,在同一个CPU上执行(切片)。

2.并发的两个模型:共享内存(只能用于线程)和消息传递(线程、进程)。

进程和线程

1.进程和线程都是并发模块的类型。进程比较“重量级”,私有空间,彼此隔离;线程“轻量级”,是程序内部的控制机制。一个进程可以形成多个线程。
2.每个应用至少有一个线程,主线程可以创建其它的线程。
3.创建线程的方法:继承Thread;从Runnable接口构造Thread对象。
在这里插入图片描述
在这里插入图片描述

创建线程需要调用Thread类的start方法,不能运行具体的run方法

交错(Interleaving)和竞争

1.时间分片:虽然有多个线程,但只有一个CPU,每个时刻只能执行一个线程。通过时间分片在多个进程/线程间共享处理器。由操作系统自动调度。
2.共享内存时的竞争情况
不恰当的分片操作会导致错误。右侧A和B发生了竞争/线程干扰。

共享内存多线程的运行结果实例,每条语句可划分为读取-计算-写回三个原子操作

3.消息传递时的竞争情况
由于时间分片,消息传递机制也无法解决竞争问题。
4.调用方法主动影响交错现象
①Thread.sleep(time) 线程休眠time毫秒
②Thread.interrupt() 向线程发出中断信号,例如t.interrupt(),即在其它线程里向t发出中断信号。收到中断信号后t不一定中断,由t本身决定。正常运行期间,即使收到中断信号也不会理会;在休眠时收到中断信号则抛出异常。
在这里插入图片描述
③Thread.join() 让线程保持执行,直到其执行结束。执行该操作时,也会检测其它线程发来的中断信号。
在这里插入图片描述
t1收到中断信号时,如果一次循环都未执行,则先输入if再输出else;如果执行一次,则先输出else再输出if;如果已经进行两次循环则输出两个else。此外t1和t2的start执行先后不定。
在这里插入图片描述

保证线程安全的策略

1.Confinement
要求类中方法不能访问属性(过于严格)。
2.Immutability
使用不可变数据类型和不可变引用,避免多个线程之间的竞争。如果是有益可变性,则需要通过“加锁”保证线程安全。
3.使用线程安全数据类型
如果必须使用mutable数据类型在多个线程之间共享数据,要使用线程安全的数据类型。一般来说JDK为ADT额外提供一个线程安全的类,但性能受影响。List、Map、Set都是线程不安全的,API提供集合类的包装,对每个操作都以原子操作进行。执行其上的某个操作是线程安全的,但如果多个操作放在一起,仍然不安全。//即使在线程安全的集合类上,使用iterator也是不安全的。除非使用lock机制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.锁和同步

①程序员负责多线程之间对mutable数据的共享操作,通过同步策略避免多个线程同时访问数据。使用锁机制,获得对数据的独家更改权,其它线程的访问被阻塞。
②Lock是Java的内嵌机制,每个对象都有相关联的lock。
在这里插入图片描述
③Lock用以保护共享数据。要实现互斥,则必须使用同一个lock进行保护。
④构造方法默认互斥,不需加锁。除非必要,否则不加锁;如果使用,要尽量缩小范围。因为会给性能带来极大影响。
⑤对静态方法进行加锁,会同时锁住类的所有对象。
在这里插入图片描述1和4正确。A获得了list的锁并不意味着其它对象不能获取/改变list的元素。对同一个mutable对象的操作,必须在各线程里用synchronized全部保护起来。对于该例子即是将B的两条语句锁住。
在这里插入图片描述3和4需要锁住。
⑧使用lock的条件:任何共享的mutable变量/对象在被读/写的时候必须加锁。涉及到多个mutable变量的时候,它们必须被同一个lock保护(例如开始和结束时间)。

死锁

1.多个线程竞争lock,相互等待对方释放lock(必须满足多个线程使用多个锁、访问顺序不同)。
2.避免方法:多个线程使用同一顺序的lock;用单个lock保护多个对象(粗粒度)。

wait(), notify(), notifyAll()

都是object类的方法。需要在synchronized块中调用,要求调用对象和lock的对象相同。

o.wait(): 释放o的锁(阻塞当前线程),进入到o的等待队列中。
o.notify(): 唤醒等待队列的一个线程。
o.notifyAll(): 唤醒等待队列的所有线程。

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

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

相关文章

打爆你的 CPU

通过一段代码打爆你的 CPUIntro这是这个煞笔代码系列的最后一篇——Full CPU,相对来说也比前面三个简单一些,没有那么多的知识点。今天来尝试写一段代码,把 CPU 打满,让所有处理器的 CPU 使用率达到 100%,Lets do it.如…

吴恩达DeepLearningCourse1-神经网络和深度学习

计划在9月4日(截止日期)之前完成DeepLearning的所有课程学习。每个课程对应一篇博客,根据学习进度随时更新。 参考课程文章目录(一)深度学习概论结构化数据和非结构化数据提高效果的方法(二)神经…

吴恩达DeepLearningCourse2-改善深层神经网络:超参数调试、正则化以及优化

文章目录第一周:深度学习的实用层面训练、开发、测试集偏差、方差机器学习基本步骤L2正则化Dropout(随机失活)正则化其它正则化方法正则化输入神经网络的权重初始化梯度检验第二周:优化算法Mini-Batch梯度下降法指数加权平均指数加…

面向监狱编程:一伙人植入木马程序至 559 万部手机,盈利 33 万!

2018 年下半年以来,孙某(上海宏路数据技术股份有限公司副总经理)与苏某(北京亿量科技有限公司法定代表人)商议合作开展锁屏拉起广告业务(通过在用户手机上植入带有木马程序的 SDK,可控制手机在锁…

吴恩达DeepLearningCourse3-结构化机器学习项目

文章目录第一周:机器学习策略1正交化单一数字评估指标满足和优化指标训练/开发/测试集机器学习和人的表现第二周:机器学习策略2进行误差分析修正标注错误的数据使用来自不同分布的数据进行训练和测试数据分布不匹配时的偏差与方差的分析处理数据分布不匹…

程序员过关斩将--搞定秒杀,只需要这几步!!

“灵魂拷问秒杀这种大并发的写场景,直接分库分表开干?应对秒杀活动的流量高峰很难吗?不要拿淘宝级别的秒杀忽悠我秒杀活动特点我敢说凡是做过电商的同学,都会遇到运营展开的秒杀,限时购等“高并发”的活动。市面上也有…

吴恩达DeepLearningCourse4-卷积神经网络

部分内容参考之前的笔记 PyTorch深度学习实践 文章目录第一周:卷积神经网络边缘检测Padding、Stride三维卷积卷积神经网络中的一层池化层第二周:深度卷积网络实例探究残差网络1x1卷积Inception模块和网络卷积神经网络的迁移学习第三周:目标检…

那些鼓吹国内首个.NET 5框架的,该醒醒了!

前两天看过园子里有篇【国内首个 .NET 5 框架 XX 斩获 XXX stars,XXX 发布】,一顿羡慕嫉妒恨啊。我这.net core 3.1才上手没几天,还没用热乎呢,你这.NET 5的框架都出来了。我好难啊!不过难归难咱也得跟上啊。于是一个天高云淡的的…

吴恩达DeepLearningCourse5-序列模型

终于在八月末学完了这门课程,这个月虽然为此不停地忙碌,但每天都在进步也是一种乐趣。 吴恩达教授的课程循序渐进,适合初学者,非常感谢他的辛苦付出。 文章目录第一周:循环序列模型循环神经网络(RNN&#…

IdentityServer4系列 | 客户端凭证模式

一、前言从上一篇关于 快速搭建简易项目中,通过手动或者官方模板的方式简易的实现了我们的IdentityServer授权服务器搭建,并做了相应的配置和UI配置,实现了获取Token方式。而其中我们也注意到了三点就是,有哪些用户(users)可以通过…

数据结构 - 链表

准备重启尘封一年的博客作为学习笔记,看看自己能坚持多久。 最近会记录做过的算法题,语言描述只用于会意,仅供参考。 文章目录0.从尾到头获取链表的值(不是反转链表)1.寻找/删除单链表倒数第k个节点3.寻找单链表的中点…

[读书笔记] 《修炼之道:.NET 开发要点精讲》

《修炼之道:.NET 开发要点精讲》目录《修炼之道:.NET 开发要点精讲》第 1 章 另辟蹊径:解读.NET1.7 本章思考 > 位置 465第 2 章 高屋建瓴:梳理编程约定2.2 方法与线程的关系 > 位置 5192.7 线程安全 > 位置 5952.8 调用与回调 > 位置 6612.…

ASP.NET Core 使用 gRPC 初探

(RPC通讯示意图)为什么突然说到gRPC呢,其实以前就想说一说这个东西,也想尝试使用一下,一直没有机会,一直看我公众号的小伙伴肯定都知道,这几天一直在录制一个《eShopOnContainer微服务架构》系列…

源码都没调试过,怎么能说熟悉 redis 呢?

一:背景 1. 讲故事记得在很久之前给初学的朋友们录制 redis 视频课程,当时结合了不少源码进行解读,自以为讲的还算可以,但还是有一个非常核心的点没被分享到,那就是源码级调试, 对,读源码还远远…

算法 - DFS/BFS

写DFS函数的时候首先确定当前位置是否已经加入路径 DFS函数大概率会传递“位置信息”,根据位置信息获取下一步的选择,(大部分是在循环中)选择、执行、回退 在哪做选择,就在哪退出选择,参考题9 def DFS()…

你想象中的Task后续,很简单?

【导读】前不久,写过一篇关于Task的简短文章,通过评论和转载得到好评,刚好我昨晚又写了一篇实现简单的消息队列也提到了Task,难道不应该是看具体执行什么操作,再考虑最佳方案?本文我们再次通过简短内容谈谈…

5G在工业互联网应用的机遇与挑战

移动通讯经过十年一代的发展,已经从1G发展到了5G,峰值速率实现十年千倍的增长,1G到4G是面向个人的,而5G是面向产业互联网和智慧城市服务。5G是一个颠覆性的技术,低时延(每秒钟下载一部高清电影)…

[C#.NET 拾遗补漏]10:理解 volatile 关键字

要理解 C# 中的 volatile 关键字,就要先知道编译器背后的一个基本优化原理。比如对于下面这段代码:public class Example {public int x;public void DoWork(){x 5;var y x 10;Debug.WriteLine("x " x ", y " y);} }在 Releas…

跟我一起学.NetCore之MediatR好像有点火

前言随着微服务的流行,而DDD(领域驱动设计)也光速般兴起,CRQS(Command Query Responsibility Seperation--命令查询职责分离)、领域事件名词是不是经常在耳边环绕,而MediatR组件经常用来对其技术的落地,凭这,小伙伴们说…

不想写脚本清理 mongodb 中的垃圾数据,ttlIndex 能帮到你!

mongodb一直都在不断的更新,不断的发展,那些非常好玩也非常实用的功能都逐步加入到了mongodb中,这不就有了本篇对ttlindex的介绍,刚好我们的生产业务场景中就有一个案例。。。一:案例分析 生产的推荐系统要给用户发送短…