软件构造复习6

1.并发

创建线程
1.继承Thread类,重写run()方法
new HellowThread().start();开始线程
2.实现runnable接口,重写run()方法
new Thread(new HellowThread()).start();开始线程

特性:虽然有多线程,但只有一个核,每个时刻只能执行一个线程

线程的竞争
单行、单条语句都未必是原子的
看下面这个例子:
在这里插入图片描述
每一个赋值语句分为三部分:
1.从静态变量x中读出数值
2.执行乘法运算
3.将结果赋值给x

于是可能出现的结果是5,6,10,30

消息传递机制也无法解决竞争条件问题
线程的休眠:Thread.sleep(time),将某个线程休眠,意味着其他线程得到更多的执行机会,进入休眠的线程不会失去对现有monitor或锁的所有权
向线程发出中断信号:t.interrupt() ,在其他线程里向t发出中断信号
检查线程是否被中断:t.isInterrupted()

正常运行期间,即使接收到中断信号,也不理会,只是改变了线程的中断状态
sleep,join,wait等能相应中断信号,并抛出异常,经过异常处理,才算真正结束进程

Thread.yield(): 使用该方法,线程告知调度器:我可以放弃CPU的占用权,从而可能引起调度器唤醒其他线程
Thread.join(): 让当前线程保持执行,直到其执行结束

2.线程安全

保证线程安全的方法

  1. 限制数据共享
  2. 共享不可变数据
  3. 共享线程安全的可变数据
  4. 同步机制:通过锁的机制共享线程不安全的可变数据,变并行为串行

具体方法
1.线程之间不共享mutable数据类型
2.避免全局变量
3.如果一个ADT的rep中包含mutable的属性且多线程之间对其进行mutator操作,那么就很难使用confinement策略来确保该ADT是线程安全的
4.使用不可变数据类型和不可变引用,避免多线程之间的race condition

注意事项
1.一般来说,JDK同时提供两个相同功能的类,一个是threadsafe,另一个不是。原因:threadsafe的类一般性能上受影响
如 StringBuffer vs. StringBuilder
2.集合类都是线程不安全的, Java API提供了进一步的decorator,对它们的每一个操作调用,都以原子方式执行, 不会与其他操作interleaving
如private static Map<Integer,Boolean>cache=Collections.synchronizedMap(new HashMap<>());
在使用synchronizedMap(hashMap)之后,不要再把参数hashMap共
享给其他线程,不要保留别名,一定要彻底销毁
3. 即使在线程安全的集合类上,使用iterator也是不安全的
4. 即使是线程安全的collection类,仍可能产生竞争 – 执行其上某个操作是threadsafe的,但如果多个操作放在一起,仍旧不安全

3.锁与同步

使用锁机制,获得对数据的独家mutation权,其他线程被阻塞,不得访问
要互斥,必须使用同一个lock进行保护

方法1
在这里插入图片描述
方法2
在这里插入图片描述
这种方法默认synchronized(this),用自身的实例做锁,对象层面

方法3:
在这里插入图片描述
加入static关键字,用这个类做锁,类层面

happens-before机制

被同一个锁保护的线程A,线程B
线程A执行完后,线程B执行
线程A的结果或影响能被线程B获取
在这里插入图片描述

注意事项:
1.任何共享的mutable变量/对象必须被lock所保护,涉及到多个mutable变量的时候,它们必须被同一个lock所保护

死锁:多个线程竞争lock,相互等待对方释放lock
在这里插入图片描述

o.wait(): 释放当前拥有o锁的线程,使其进入等待序列
o.notify(): 唤醒拥有o锁的某个线程
o.notifyAll(): 唤醒拥有o锁的所有线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值