多线程讲解(三)

目录标题

一 线程同步(多个线程操作一个资源) 重点难点

在这里插入图片描述

现实生活中 排队的名字 在代码中叫做队列

在这里插入图片描述

处理多线程问题时 多个线程访问同一个对象这种情况叫做并发
这个时候我们就需要线程同步 线程同步其实就是一种等待机制(排队)

在这里插入图片描述

队列的话 类似于 食堂大妈给同学打饭必须要排队才能安全快速的进行
锁机制的话 就类似于 大家一起上厕所 一个人进去厕所后 会锁上门 否则的话 后面的人就会进去造成不应该的矛盾和麻烦
所以为了提高安全性 形成的条件就是 队列加锁

二 什么是线程同步

在这里插入图片描述

synchronized 线程同步



为了保证线程的安全性 当一个线程获得对象的排它锁,独占资源 其他线程必须等待 使用完后才能释放锁即可
但是这么保证线程固然安全 但也缺少了性能问题
出现了以下的问题:
1 一个线程 持有锁会导致其他所有需要此锁的线程来消耗时间挂起
所以锁的存在影响到了效率 降低了性能
2 在多线程的竞争下 加锁 释放锁 会导致比较多的上下文切换和调度延时 引起性能问题
3 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置 引起性能问题(例如一个大号的同学先进入厕所 一个小号的同学在外面等了半个小时 造成性能倒置 应该是小号先进入大号在进入)
所以 安全性提高了 但是性能会降低
性能提高了 安全性会降低!!!重点




练习一

不安全买票
不安全的买票案例
//可以看出线程不安全 有人拿到了负数的票数 比如黄牛党拿到了第-1票




为什么会拿到负的票数
线程不会排队 当剩下最后一张票时 它们同时去抢 出现了负数的结果



//定义售卖票数停止方式
boolean flag=true;



@Override
public void run() {
//买票
while (flag){
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}




//判断是否有票
if (ticketNums<=0){
flag=false;
return;
}



在这里插入图片描述

练习二

两个人不安全的银行取钱案例



//创建一个去取钱的对象
//传入的参数意思为:你在结婚基金中取出50元
//传入的参数意思为:妻子在结婚基金中取出100元
Drawing you = new Drawing(account, 50, “你”);
Drawing her = new Drawing(account, 100, “妻子”);




//银行:模拟取款
//因为银行不涉及多个线程操控一个对象用继承extends即可
//即多个银行让一个人同时取钱不可能实现
//因为此刻的银行不涉及多个线程操控同一个对象(深度理解)
//理解:因为这是一个对象去银行取钱 不涉及多个对象帮助这一个对象去银行取钱
//所以用继承extend更为方便一点 不需要多个线程帮助这一个对象对银行取钱
//参考对比继承Thread类和实现Runnable接口:
//继承Thread类时只有一份资源
//实现Runnable接口时一份资源但多个代理
class Drawing extends Thread{}




//构造器
//在构造器中传入的参数 为 账户 和取多少钱和 哪个对象去取钱
public Drawing(Account account,int drawingMoney,String name){
//复习知识点super
//子类super调用父类的构造方法 必须在构造方法的第一行
//在这里调用的时
super(name);
//重点: 为什么用super(name);调用父类的参数而不用this.name=name;
//this.name=name;//这里可以看到this.name=name;这行代码报错
//为什么呢: 原因 因为Drawing继承了 Thread父类 而父类中的有参构造肯定含有this.name=name;
//name这个参数 所以此刻如果再创建那么就会重复 所以就会出现报错的现象
//解决方法 : 调用super();方法 调用父类的name参数来用
th

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值