首页 > 其他分享 >多线程的使用-->3

多线程的使用-->3

时间:2024-09-02 18:24:23浏览次数:12  
标签:同步 -- 队列 对象 使用 线程 多线程 等待 wait

1.死锁

  • 在线程同步过程中,因为多线程争抢锁资源,所以有些线程会执行,有些线程会等待。

  • 如果线程A和线程B分别需要 X和Y两个锁资源

    恰好A获得了X资源,准备争抢Y , 而B获得了Y资源,准备争抢X,此时A和B就进入了一中死锁状态。

如何解决死锁问题?

①从业务逻辑层面解决

让它们随机抢资源        让它们抢资源时间不同

②从技术层面

给它们添加一把锁 可以使用lock锁   trylock(5)

2.线程生命周期

3.线程中断方法

3.1Thread.sleep()方法

  • Thread类的一个静态方法

  • 让当前正在执行的线程处于睡眠状态

  • 指定睡眠时间,时间过后,自动唤醒,唤醒后,线程进入就绪状态,准备争抢CPU

  • 睡眠期间,一旦被其他线程调用了当前线程的interrupt方法中断,会抛出异常

  • 如果线程抢占了一个对象锁,睡眠期间不会释放对象锁。

3.2Thread.yield()方法

让步,当前线程让出CPU,与其他线程重新争抢CPU

3.3Thread.join()方法

  • 插队,当前线程调用指定线程对象的join方法,将指定线程加入当前线程的执行序列

  • 当指定线程执行完毕后,当前线程才会继续执行。(此时直接处于运行状态)

    通过底层原码可知,join方法会不挺的检测线程的存活状态

    当目标线程执行完毕后,自动销毁,不再存货

    当前线程一旦发现目标线程销毁,则继续执行自己的操作。在判断时一定已经获得cpu了

  • 最常用的就是通过join方法,实现确保所有的其他线程都执行完毕,当前线程再继续执行。

3.4Object.wait()方法

  • 这是Object对象的方法,也是所有对象都拥有的方法

  • 该方法必须用在同步方法或同步代码段中

    因为线程要想执行同步方法或同步代码段,需要先获得对应的锁对象

  • 在同步方法或同步代码段中,获得的是哪个对象的对象锁,才可以调用哪个对象的wait方法

    表示让出当前对象的对象锁,获得当前对象锁的当前线程处于等待状态

    等待再次获得该对象的对象锁,才能继续执行剩下未完成部分代码

  • 一般多因为逻辑数据未达标,需要临时让出对象锁,让其他线程先执行。

  • 当其他线程使用完该对象的对象锁后,需要调用该对象的notify或notifyall方法唤醒等因为wait方法而等待该对象锁的线程。

  • wait的重载方法

    obj.wait()会一直等待,直到被另一个线程调用obj.notify or obj.notifyall唤醒

    obj.wait(time)会等待指定的毫秒数,自动唤醒,唤醒后如果依然没有获得锁,会继续等待

  • notify和notifyAll方法

    • 也需要在同步方法或同步代码段中使用,并且需要先确保获得了该对象的对象锁

    obj.notify()表示随机唤醒一个因为wait方法等待当前锁的线程

    obj.notifyAll()表示唤醒所有因为wait方法而等待当前锁的线程

  • 同步队列与等待队列

    • synchronized锁是依赖于系统级别的锁,称之为重量级锁

    • 在应用过程中,会产生两个队列

      • 一个称为同步队列,当多个线程因调用同步方法或同步代码段时,对同一把锁进行争抢,当一个线程抢到,其他线程进入同步等待队列

      • 一个称为条件队列,当一个线程已经获得了对象锁,因为某些业务条件不支持,

        不得不通过wait方法让出锁,同时重新等待这把锁

        此时当前线程会被存入条件等待队列

        notify方法唤醒的是条件等待队列中的线程。

        唤醒之后,条件等待队列中的线程会被加入同步等待队列

    • 当线程1234按顺序争抢锁时,线程1获得锁, 线程234进入同步队列

      当线程1使用完毕,释放锁后, 同步队列中的线程会按照倒序依次被唤醒

      系统级别的同步队列是一个倒序唤醒过程,不代表所有的同步队列都是这个顺序(如:lock)

3.5lock的wait等待

  • lock是synchronized的代替方案

  • 所以也提供了类似于synchronized配合wait相关的功能

  • 注意:这里使用的不是lock对象的wait方法

  • 通过lock对象可以获得一个condition对象,表示条件对象

    当业务逻辑中不满足某些条件的时候,可以基于Condition条件对象进行等待

    Condition condition = lock.newCondition();

  • 当业务执行时,遇到等待条件,通过调用condition.await(); // "buka".wait()线程等待

    进入等待队列

  • 当另一个线程使用完锁之后,通过调用condition.signal() or singalAll()唤醒线程

    将等待队列中的线程重新加入同步队列

标签:同步,--,队列,对象,使用,线程,多线程,等待,wait
From: https://blog.csdn.net/lzp122390/article/details/141826350

相关文章

  • 盲盒小程序开发,探索市场发展优势
    随着潮玩市场的火热,盲盒已经成为了一种集娱乐、社交、消费为一体的模式,越来越多的消费者被盲盒所吸引,盲盒市场也迎来了巨大的发展空间,带来了各种商业机遇,同时为创业者提供新的创业渠道。本文将探讨盲盒小程序的开发带来的发展优势。盲盒小程序是一个线上购物模式,传统的盲盒具有价格......
  • Java开发语言:ssm人力资源管理系统010(附免费源码)
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设人......
  • 在Python中如何执行语句?
    Python是一种高级编程语言,具有简洁、易读的语法结构,广泛应用于数据分析、机器学习、web开发、人工智能、游戏开发等领域。而在Python中,语句是构建程序的基本单元,通过语句来实现具体的功能操作,那么Python如何执行语句?具体请看下文。Python使用以下方法来执行语句:1、解......
  • for和do-while循环以及break和continue语句
    目录for循环语法形式循环的执行流程图for循环和while循环的区别例子do-while循环语法形式循环的执行流程图例子break和continue语句break和continue在不同循环中的区别whilefordo-whilefor循环语法形式for循环是三种循环中使用最多的,for循环的语法形式如下:f......
  • 学习Python多久才能入门?
    转行学习编程,Python语言是大多数人的首要选择。因为它不仅在web开发、游戏开发、数据分析、网络爬虫等领域有着优异的表现,更是人工智能和机器学习的首选语言,那么学会Python大概需要多久?我们一起来看看吧。学习Python所需的时间取决个人的学习速度、学习目标和学习方式。......
  • 微型直线导轨高精度运行的工作原理
    微型导轨是一种用于高精度定位和运动控制的传动装置,常用于微小化、高精密度化的机械设备中,如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Ytable,以及高速皮带驱动的设备等小型化设备。微型导轨的构成相对复杂且精密,主要由导轨体、滑块、滚动体、返......
  • 【Java】—— Java面向对象进阶:Java中的账户管理-基础账户与可透支账户的实现与测试
    目录1.基础账户类(Account)2.测试基础账户类3.可透支账户类(CheckAccount)4.测试可透支账户类运行结果1.基础账户类(Account)        写一个名为Account的类模拟账户。该类的属性和方法如下图所示。该类包括的属性:账号id,余额balance,年利率annualInterestRate;......
  • 开机就能打?没那么玄乎!客观分析 “狂躁许可”漏洞(CVE-2024-38077)及其影响范围
    一、事件背景2024年7月9日,微软官方发布了一个针对“windows远程桌面授权服务远程代码执行漏洞”(CVE-2024-38077)的修复补丁包,起初并没有引起大家的警觉。今日在国外某网站上疑似漏洞的作者公开了该漏洞的“POC验证代码”。一时激起千层浪,该漏洞开始疯狂发酵并在安全圈里转发。该文章......
  • 中国机器人大赛机器人旅游-机器人探险软件经验分享
    1比赛规则书一旦中国机器人大赛规则书发布,一定要读3遍及以上,并与前一年规则书进行对比。举个例子,2023年规则书与2022年规则书并无区别,原因可能是因为2022年比赛是线上赛。但2024年规则书相比2023年增加了重量要求,并且七、八号平台没有黄线。总决赛相比专项赛颜色识别牌的颜色......
  • F5时间设置
    方法一:NTP(推荐)注:修改ntpserver后大约需要10分钟左右才能同步成功。查看ntp状态:方法二:手动修改用命令:#date //可以查看系统时间[root@F5-AC:Active] config#date020516282013TueFeb516:28:00CST2013然后运行:#hwclock --systohc将系统时间存到BigIPBI......