首页 > 其他分享 >day5

day5

时间:2024-05-09 23:23:35浏览次数:11  
标签:锁池 调用 synchronized 对象 day5 t2 线程

课程内容:
  • 什么是并发错误?

  • 如何解决并发错误?

  • 什么是死锁?

  • 如何解决死锁?

  • 锁池和等待池的区别


什么是并发错误?
  • 并发错误的概念

    多个线程共享操作同一份数据的时候
    线程体当中连续的多行操作 未必能够连续执行
    很可能操作只完成另一部分 时间片就突然耗尽
    此时 另一个线程抢到了时间片
    直接访问了操作不完整的数据
  • *: 并发修改异常 和 并发错误 什么关系?

    并发修改异常 是Sun公司官方的程序员
      主动判断 主动校验 主动抛出的一个运行时异常
      它的主要目的 就是为了避免程序进一步执行就会导致并发错误
      最大限度的避免并发错误
      (走在荒无人烟的小路上 为了不见鬼 选择拍晕自己..)

如何解决并发错误?
  • 方式一:使用对象的互斥锁

    互斥锁 = 锁标记 = 互斥锁标记 = 锁旗标 = 监视器 = Monitor 

    synchronized = 修饰符 = 形容词

    1.修饰代码块
    synchronized(临界资源){
    需要连续执行的操作1;//
    需要连续执行的操作2;
    ...;
    }

    2.修饰整个方法
    public synchronized void add(Object obj){
    需要连续执行的操作1;
    需要连续执行的操作2;
    ...;
    }
    *: 哪怕synchronized加在方法修饰符上
    也是对 对象进行加锁

    *: Vector Hashtable StringBuffer 都是线程安全的
    它们之所以线程安全 是因为
    底层大量的方法使用了synchronized修饰

    *: 单例模式的懒汉式 需要synchronzied修饰那个getter方法

    *: synchronized 有一个其它修饰符都不具备的特性
    它隔代丢失...
    父类的synchronized方法子类能够继承吗?
    能够继承得到这个方法 但是synchronized都不见了
  • synchronized的深度理解

    *举例一
    已知: Vector类的add() 和 remove() 都是synchronized修饰的
    我们有一个Vector对象 名叫v
    有两个线程对象 名叫 t1 和 t2
    当t1线程调用v对象的add() 方法已经开始执行了
    但是还没执行结束呢 此时时间片突然耗尽
    t2线程抢到了时间片
    问:
    t2能不能调用v对象的add()? 不能
    t2能不能调用v对象的remove()? 不能

    *举例二
    已知: Hashtable类的put() 和 remove() 都是synchronized修饰的
    我们现在有两个Hashtable对象 名叫 h1 和 h2
    有两个线程 名叫 t1 和 t2

    当t1线程调用h1对象的put() 方法已经开始执行了
    但是还没执行结束呢 此时时间片突然耗尽
    而t2线程抢到了时间片
    问:
    t2线程能不能调用h1对象的put()? 不能
    t2线程能不能调用h1对象的remove()? 不能
    t2线程能不能调用h2对象的put()? 能
    t2线程能不能调用h2对象的remove()? 能
    t2线程能不能调用h2对象的xxxxx()? 能!

    综上所述:
    哪怕synchronized修饰符是加在方法签名上的
    也是对 对象进行加锁
    Java当中每个对象才有锁标记 加锁永远是对对象加锁
    不存在对方法加锁的概念!!
  • 方式二:使用面向对象的可重入锁...since JDK5.0

    java.util.concurrent.locks.ReentrantLock
    Java包的 工具包的 并发包的 锁包的 可重入锁

      lock() unlock()
      加锁   释放锁

    *:ReentrantLock 可以指定公平锁或非公平锁
    new ReentrantLock(true);
    *:公平 = 按照对锁资源申请的先后顺序依次获得

什么是死锁?
互斥锁标记使用过多或者使用不当
就会造成多个线程相互持有对方想要申请的资源
不释放的情况下 又去申请对方已经持有的资源
从而双双进入对方已经持有的资源的锁池当中
产生永久的阻塞

如何解决死锁?
    一块空间和三个方法

一块空间: 等待池
三个方法: wait() notify() notifyAll()

wait() : 让当前线程放弃[调用方法的那个对象]的锁标记(主动进入阻塞状态)
并且进入那个对象的等待池当中阻塞

notify() : 从[调用方法的那个对象]的等待池
当中随机的唤醒一个线程

notifyAll() : 从[调用方法的那个对象]的等待池当中
唤醒所有阻塞的线程

*: 它们都必须在已经持有锁标记的前提下才能使用
也就是说它们一定出现在synchronized{}当中
也就是说 想要操作对象的等待池 必须先要拿到对象的锁标记
如果没有拿到锁标记 就直接尝试操作等待池
不但会操作失败 还会触发
IllegalMonitorStateException 运行时异常

*: 它们都是Object类的方法 不是Thread的方法
因为Java当中每个对象都有等待池
每个对象都可能需要操作等待池
所以这三个方法被定义在Object类当中
       
   *举例:
       顺丰陆运 送快递的 不能坐飞机
       大货车不可能只配备一名司机

       王师傅  马师傅
       LeftThread RightThread

       1.开4个小时
       2.主动休息wait()      
                           3.开4个小时
                           4.唤醒王师傅
                           5.主动休息wait()
       6.唤醒马师傅
锁池和等待池的区别
    锁池和等待池都是Java当中每个对象都有一份的空间

锁池存放的是那些想要申请对象锁标记但是还没有得到的线程
等待池存放的是那些原本已经拿到对象锁标记
但是怕与其它线程相互阻塞 而又主动释放资源的线程

1.进入的时候是否需要释放锁标记
锁池 : 不释放锁标记
等待池 : 先释放持有锁标记

2.离开的时候是否需要调用方法
锁池 : 不需要操作
等待池 : 必须有其它线程notify()/notifyAll()

3.离开之后去往什么状态
锁池 : 返回就绪
等待池 : 进入锁池!!

标签:锁池,调用,synchronized,对象,day5,t2,线程
From: https://www.cnblogs.com/zhaodenghui33/p/18183307

相关文章

  • day1-day5听课笔记
    Typora常用快捷键标题快捷键1.ctrl+1一级标题2.ctrl+2二级标题代码块ctrlshiftk代码快捷键```javajava语言的代码块```shellshell语言的代码块#tab上面的一个键,按shift切换成英文列表有序列表//有序ctrl+shift+[无序列表//无序ctrl+shift......
  • Day5.一刷数据结构算法(C语言版) 242有效的字母异位词; 349两个数组的交集; 202快乐数; 1
        现在我们开始学习哈希表.        经过本次学习我认识到c++的便利,但是我使用的是c,那些功能c又用不了,导致代码长度一下子拉长了...        一刷的时候我还是先用c吧,等二刷的时候试试c++.        进入正题:        什么时候......
  • JAVA语言学习-Day5
    集合Java中的集合是工具类,可以存储任意数量的具有共同属性的对象应用场景无法预测存储数据的数据同时存储具有一对一关系的数据需要进行数据的增删数据重复问题体系结构Collection:List、Queue、SetMap:HashMapList有序且可重复,ArrayList、LinkedList......
  • 嵌入式学习Day5
    一、请简述什么大端存储和小端存储?大端存储:低位存储数据的高位,高位存储数据的低位小端存储,低位存储数据的低位,高位存储数据的高位二、请简述gcc的分步编译?1.预处理:展开头文件,替换宏,删除注释:gcc-Efile.c-ofile.i2.编译:检查语法的正确性,生成汇编文件:gcc-S file.i -o......
  • Day5之,原来数据类型还有这么多知识点
    Day5数据类型扩展知识关于数据类型的拓展知识二进制数是在数字前加上0b,八进制是加上0,十六进制是加上0xpublicstaticvoidmain(String[]args){//整数拓展进制二进制0b、八进制0、十六进制0xinti=10;inti2=010;//八进制inti......
  • 【WEEK5】 【DAY5】DML Language【English Version】
    2024.3.29FridayContents3.DMLLanguage3.1.ForeignKeys(ForUnderstanding)3.1.1.Concept3.1.2.Purpose3.1.3.SeveralMethodstoAdd(Write)ForeignKeys3.1.3.1.CreatingtheTablewithDirectReferenceInside(thepartbeingreferencedoftherefe......
  • 【WEEK5】 【DAY5】DML语言【中文版】
    2024.3.29Friday目录3.DML语言3.1.外键(了解)3.1.1.概念3.1.2.作用3.1.3.添加(书写)外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写(被引用的表的被引用的部分)3.1.3.2.先创建表后修改表以添加外键3.1.3.3.以上操作都是物理外键,数据库级别的外键,不建议使用->避免数......
  • 云计算第1阶段_Linxu基础知识_day5
    yum补充#yum补充rpm-qa|grepvim#列出服务器已经安装过的包​#如果不合适,查看firewalld和SELinux开关状态getenforce#查看SELinux状态setenfotce0vim/etc/selinux/configSELINUX==>no​#查看防火墙状态systemctlstatusfirewalld#永久关闭防火墙systemct......
  • Day52:WEB攻防-XSS跨站&反射型&存储型&DOM型&标签闭合&输入输出&JS代码解析
    目录XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS:(某案例测试)知识点:1、XSS跨站-输入输出-原理&分类&闭合2、XSS跨站-分类测试-反射&存储&DOMXSS跨站-输入输出-原理&分类&闭合漏洞原理:接受输入数据,输出显......
  • Day53:WEB攻防-XSS跨站&SVG&PDF&Flash&MXSS&UXSS&配合上传&文件添加脚本
    目录MXSSUXSS:UniversalCross-SiteScriptingHTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到)SVG-XSSPDF-XSSPython生成XSSFlash-XSS知识点:1、XSS跨站-MXSS&UXSS2、XSS跨站-SVG制作&配合上传3、XSS跨站-PDF制作&配合上传4、XSS跨站-SWF制作&反编译&上传XSS......