JAVA高级进阶11多线程

news2024/10/6 6:34:30

第十一天、多线程

线程安全问题

线程安全问题

  • 多线程给我们带来了很大性能上的提升,但是也可能引发线程安全问题

  • 线程安全问题指的是当个多线程同时操作同一个共享资源的时候,可能会出现的操作结果不符预期问题

线程同步方案

认识线程同步

线程同步

  • 线程同步就是让多个线程先后依次访问共享资源,这样就解决了安全问题,它最常见的方案就是加锁

  • 加锁 : 每次只允许一个多线程加锁,加锁后才能进入访问 ,访问完毕后自动解锁,之后其它线程才能加锁进来

方式一 : 同步代码块

同步代码块

  • 作用 : 把访问共享资源的核心代码给上锁,以此保证线程安全

  • synchronized(同步锁) {
            访问共享资源的核心代码
    }
  • 原理 : 每次只允许一个线程加锁后进入,执行完毕后自动解锁,其他线程才可以进来执行

同步锁的注意事项

  • 对于当前同时执行的线程来说,同步锁必须是同一把锁(同一个对象),否则会出bug

  • 对于实列方法建议使用this作为锁对象

  • 对于静态方法建议使用字节码(类名.class)对象作为锁对象

方式二:同步方法

同步方法

  • 作用:把访问共享资源的核心方法给上锁,以此保证线程安全

  • 修饰符 synchronized 返回值类型 方法名称(形参列表) {
            操作共享资源的代码
    }
  • 原理:每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行

同步方法底层原理

  • 同步方法其实底层也是有隐式锁对象的,只是锁的范围是整个方法代码

  • 如果方法是实例方法:同步方法默认用this作为的锁对象

  • 如果方法是静态方法:同步方法默认用类名.class作为的锁对象

方式三:Lock锁

Lock锁

  • Lock锁是JDK5开始提供的一个新的锁定操作,通过它可以创建出锁对象进行加锁和解锁,更灵活、更方便、更强大

  • Lock是接口,不能直接实例化,可以采用它的实现类ReentrantLock来构建Lock锁对象

Lock的常用方法

线程池

认识线程池

当前创建线程的问题

  • 用户每发起一个请求,后台就需要创建一个新线程来处理,任务处理完毕之后,线程就会被销毁

  • 下次新任务来了肯定又要创建新线程处理的,用完又要被销毁

  • 而创建和销毁线程的开销是很大的,当请求过多时,肯定会产生大量的线程出来,这样会严重影响系统的性能

什么是线程池

  • 线程池就是一个可以复用线程的技术

  • 它就像一个大的池子一样,里面可以放置一些线程,当需要的时候,就从里面取出来用,用完了就还回去

  • 如此一来,就不必频繁的创建和销毁线程了,大大的提高了线程的利用率,提供系统的性能

线程池的工作原理以及执行流程

  • 判断核心线程数是否已满,如果没满,则创建一个新的核心线程来执行任务

  • 如果核心线程满了,则判断工作队列是否已满,如果没满,则将任务存储在这个工作队列

  • 如果工作队列满了,则判断最大线程数是否已满,如果没满,则创建临时线程执行任务

  • 如果最大线程数已满,则执行拒绝策略

如何创建线程池?

谁代表线程池?

  • JDK 5.0起提供了代表线程池的接口:ExecutorService

如何得到线程池对象?

  • 使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象

ThreadPoolExecutor

  • 参数一:corePoolSize : 指定线程池的核心线程的数量

  • 参数二:maximumPoolSize:指定线程池的最大线程数量

  • 参数三:keepAliveTime :指定临时线程的存活时间

  • 参数四:unit:指定临时线程存活的时间单位(秒、分、时、天)

  • 参数五:workQueue:指定线程池的任务队列

  • 参数六:threadFactory:指定线程池的线程工厂

  • 参数七:handler:指定线程池的任务拒绝策略(线程都在忙,任务队列也满了的时候,新任务来了该怎么处理)

任务缓冲队列

任务拒绝策略

线程池处理Runnable任务

ExecutorService的常用方法

线程池处理Callable任务

ExecutorService的常用方法

Executors工具类实现线程池

Executors

  • 是一个线程池的工具类,提供了很多静态方法用于返回不同特点的线程池对象

  • 注意 :这些方法的底层,都是通过线程池的实现类ThreadPoolExecutor创建的线程池对象

Executors使用可能存在的陷阱

  • 大型并发系统环境中使用Executors如果不注意可能会出现系统风险

线程通信(了解)

什么是线程通信?

  • 当多个线程共同操作共享的资源时,线程间通过某种方式互相告知自己的状态,以相互协调,并避免无效的资源争夺

线程通信的常见模型(生产者与消费者模型)

  • 生产者线程负责生产数据

  • 消费者线程负责消费生产者生产的数据

  • 注意:生产者生产完数据应该等待自己,通知消费者消费;消费者消费完数据也应该等待自己,再通知生产者生产

Object类的等待和唤醒方法

注意

  • 上述方法应该使用当前同步锁对象进行调用

理论补充

进程与线程

进程与线程

  • 进程:正在运行的程序(软件)就是一个独立的进程

  • 线程:线程是属于进程的,一个进程中可以同时运行很多个线程

  • 关系:进程=火车 线程=车厢

并发与并行

并发的含义

  • 进程中的线程是由CPU负责调度执行的,但CPU能同时处理线程的数量有限,为了保证全部线程都能往前执行, CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉这些线程在同时执行,这就是并发

并行的含义

  • 在同一个时刻上,同时有多个线程在被CPU调度执行

多线程到底是怎么在执行的?

  • 并发和并行同时进行的

线程生命周期

线程的生命周期和状态

  • 也就是线程从生到死的过程中,经历的各种状态及状态转换,Java总共定义了6种状态

线程的6种状态互相转换

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

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

相关文章

swiftui中几个常用的手势控制单击点击,双击和长按事件

简单做了一个示例代码,包含三个圆形形状,配置了不同的事件,示例代码: // // RouterView.swift // SwiftBook // // Created by song on 2024/7/4. //import SwiftUIstruct RouterView: View {State var isClick falsevar bod…

中实新材料:领航绿色建材新纪元,北京创新力量再攀高峰!

近期,北京中实新材料有限责任公司(以下简称“中实新材料”)以一系列耀眼的成果,彰显了其在绿色建材领域的卓越领导地位,不仅在生产效能、技术创新、市场拓展上取得了显著突破,更在社会责任与荣誉表彰上赢得了广泛赞誉。作为中关村科技发展(控股)股份有限公司旗下的璀璨明珠,中实…

Java - 程序员面试笔记记录 实现 - Part3

4.1 线程与进程 线程是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间以及一些进程级资源,但拥有自己的栈空间。 4.3 Java 多线程 方法一:继承 Thread 类,重写 run 方法;…

实验五 数据库完整性约束的实现与验证

题目 在实验四的基础上,重新创建以下三个表: 会员表:member(memno,memname,address,telephone,username,userpwd),主码为memno,属性memname不能取空值 员工表:employee(empno,empname,depno,sex,telephone…

【电源专题】DC-DC电路设计为什么一般只考虑电感DCR而不考虑Q值呢?

什么是电感器(线圈)的Q值? Q值是表示电感器质量的参数。Q是Quality Factor(质量系数)的简称。线圈会顺利流过直流电流,但会对交流电流产生电阻。这称为感抗,交流频率越高则越大。 此外,绕组虽是导体…

基于Istio的多网关运行时:配置、部署和应用

1. 引言 Istio是一个开源的服务网格,主要应用于简化微服务架构中的服务间通信、提供强大的监控能力以及加强服务的安全管理。通过利用Sidecar模式部署的Envoy代理,Istio能够在几乎无需修改服务代码的情况下,实现服务发现、负载均衡、加密通信…

C语言实战 | Flappy Bird游戏

Flappy Bird游戏是由一名越南游戏制作者独自开发的,曾经风靡全球。游戏规则非常简单,玩家必须控制一只小鸟,跨越由各种长度的水管所组成的障碍物,如果撞上管道游戏就结束,如图11.11所示。 ■ 图11.11Flappy Bird 游戏 …

go语言day08 泛型 自定义错误处理 go:协程

泛型: 抛错误异常 实现error接口类型 用java语言解释的话,实现类需要重写error类型的抽象方法Error().这样就可以自定义异常处理。 回到go语言,在Error()方法中用*argError 这样一个指针类来充当error接口的实现类。 在f2()方法中定义返回值…

IMU用于仿生水下机器人姿态估计

近期,自中国农业大学的研究团队从海豚身上汲取灵感,成功研发出一种创新性的双腱驱动机器人海豚尾鳍。这项创新性的设计不仅能够实现全方向运动,还能精细地模拟海豚的推力特性,揭示了其背后隐藏的力学秘密。 这款机器人尾鳍设计独特…

23432443

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

A股现在3000点已经是顶了吗?

今天的A股,让人咬牙切齿了,你们知道是为什么吗?盘面上出现2个重要信号,一起来看看: 1、今天两市高开低走,近4900家股票回落,股民痛心疾首了。昨晚中概股都涨疯了,美股的科技股微软和…

【web APIs】快速上手Day03(Dom事件进阶)

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

2024亚太杯中文赛数学建模选题建议及各题思路来啦!

大家好呀,2024年第十四届APMCM亚太地区大学生数学建模竞赛(中文赛项)开始了,来说一下初步的选题建议吧: 首先定下主基调, 本次亚太杯推荐大家选择B题目。C题目难度较高,只建议用过kaiwu的队伍…

商务视频推广打造有吸引力的7个秘诀-华媒舍

商务视频推广是现代企业发展的重要工具,它能够帮助企业吸引更多的目标客户,提升品牌知名度,增加销售量。但是,如何打造一部有吸引力的商务视频推广呢?本文将为您介绍7个秘诀,帮助您在商务视频推广中取得成功…

中国国家标准介绍

一、介绍 中国国家标准信息公共服务平台,这是由中国国家市场监督管理总局和中国国家标准化管理委员会共同运营的官方网站 https://openstd.samr.gov.cn/ 标准分为三类: GB:强制性国家标准GB/T:推荐行国家标准GB/Z:指导…

【Linux系统】文件系统 软硬链接

文件被打开了? 这个文件已经被打开???什么意思,我们的Linux中存在非常多的文件,被打开的文件是少量的,我们要找到这个文件,先在磁盘中找到,就必须要通过这个文件的文件名…

一站式广告监测新体验,Xinstall助你广告投放更精准

在这个移动互联网飞速发展的时代,App推广与运营成为了每个开发者与广告主关注的焦点。然而,面对琳琅满目的广告平台和复杂的投放环境,如何精准评估广告效果、优化投放策略,成为了摆在面前的一道难题。今天,我们就来聊聊…

Linux中为什么etc是存放配置文件

在计算机系统中,/etc 是一个目录的名称,通常位于Unix和类Unix操作系统中,如Linux。这个目录用于存放系统配置文件。/etc 的命名来源于早期Unix系统中的 "etcetera"(拉丁语 "et cetera" 的缩写,意为…

RK3568驱动指南|第十六篇 SPI-第195章 实践:移植官方mcp2515驱动

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Ollama基于Casaos一键部署,并接入Dify知识库,无需再为API付费

什么是Ollama Ollama是一个开源的大型语言模型服务工具,它帮助用户快速的运行大模型。浪浪云将它做为一键部署通过简单的安装,用户可以执行一条命令就可以运行开源大型语言模型,如 llama3 ,通以千问。极大地简化了部署和管理LLM的过程&#x…