JAVA高级进阶11多线程

第十一天、多线程

线程安全问题

线程安全问题

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

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

线程同步方案

认识线程同步

线程同步

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

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

方式一 : 同步代码块

同步代码块

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

  • 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.mzph.cn/diannao/41121.shtml

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

相关文章

内网渗透学习-杀入内网

1、靶机上线cs 我们已经拿到了win7的shell,执行whoami,发现win7是administrator权限,且在域中 执行ipconfig发现了win7存在内网网段192.168.52.0/24 kali开启cs服务端 客户端启动cs 先在cs中创建一个监听器 接着用cs生成后门,记…

Mysql 的第二次作业

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 1)登陆数据库。 打开命令行,输入登陆用户名和密码。 mysql -uroot -p123456 ​ 2)切换数据库…

菜鸡的原地踏步史(◐‿◑)

leetcode启动!(╯‵□′)╯︵┻━┻ 尝试改掉想到哪写哪的代码坏习惯 链表 相交链表 public class Solution {/**ac(公共长度)b所以 链表A的长度 a c,链表B的长度b ca b c b c a只要指针a从headA开始走,走完再…

利用pg_rman进行备份与恢复操作

文章目录 pg_rman简介一、安装配置pg_rman二、创建表与用户三、备份与恢复 pg_rman简介 pg_rman 是 PostgreSQL 的在线备份和恢复工具。类似oracle 的 rman pg_rman 项目的目标是提供一种与 pg_dump 一样简单的在线备份和 PITR 方法。此外,它还为每个数据库集群维护…

抖音使矛,美团用盾

有市场,就有竞争。抖音全力进军本地生活市场欲取代美团,已不是新闻。 互联网行业进入存量时代,本地生活市场是为数不多存在较大增长空间的赛道。艾媒咨询数据显示,预计2025年在线餐饮外卖市场规模达到17469亿元,生鲜电…

Day05-01-jenkins进阶

Day05-01-jenkins进阶 10. 案例07: 理解 案例06基于ans实现10.1 整体流程10.2 把shell改为Ansible剧本10.3 jk调用ansible全流程10.4 书写剧本 11. Jenkins进阶11.1 jenkins分布式1)概述2)案例08:拆分docker功能3)创建任务并绑定到…

安装 ClamAV 并进行病毒扫描

安装 ClamAV 并进行病毒扫描 以下是安装 ClamAV 并使用它进行病毒扫描的步骤: 1. 安装 ClamAV 在 Debian/Ubuntu 系统上: sudo apt update sudo apt install clamav clamav-daemon在 RHEL/CentOS 系统上: sudo yum install epel-release…

开发指南040-swagger加header

swagger可以在线生成接口文档,便于前后端沟通,而且还可以在线调用接口,方便后台调试。但是接口需要经过登录校验,部分接口还需要得到登录token,使用token识别用户身份进行后续操作。这种情况下,都需要接口增…

【刷题笔记(编程题)05】另类加法、走方格的方案数、井字棋、密码强度等级

1. 另类加法 给定两个int A和B。编写一个函数返回AB的值,但不得使用或其他算数运算符。 测试样例: 1,2 返回:3 示例 1 输入 输出 思路1: 二进制0101和1101的相加 0 1 0 1 1 1 0 1 其实就是 不带进位的结果1000 和进位产生的1010相加 无进位加…

ssm校园志愿服务信息系统-计算机毕业设计源码97697

摘 要 随着社会的进步和信息技术的发展,越来越多的学校开始重视志愿服务工作,通过组织各种志愿服务活动,让学生更好地了解社会、服务社会。然而,在实际操作中,志愿服务的组织和管理面临着诸多问题,如志愿者…

dledger原理源码分析系列(一)-架构,核心组件和rpc组件

简介 dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的架构,核心组件;rpc组…

【pytorch16】MLP反向传播

链式法则回顾 多输出感知机的推导公式回顾 只与w相关的输出节点和输入节点有关 多层多输入感知机 扩展为多层感知机的话,意味着还有一些层(理解为隐藏层σ函数),暂且设置为 x j x_{j} xj​层 对于 x j x_{j} xj​层如果把前面的…

迅捷PDF编辑器合并PDF

迅捷PDF编辑器是一款专业的PDF编辑软件,不仅支持任意添加文本,而且可以任意编辑PDF原有内容,软件上方的工具栏中还有丰富的PDF标注、编辑功能,包括高亮、删除线、下划线这些基础的,还有规则或不规则框选、箭头、便利贴…

【护眼小知识】护眼台灯真的护眼吗?防近视台灯有效果吗?

当前,近视问题在人群中愈发普遍,据2024年的统计数据显示,我国儿童青少年的总体近视率已高达52.7%。并且近视背后潜藏着诸多眼部并发症的风险,例如视网膜脱离、白内障以及开角型青光眼等,严重的情况甚至可能引发失明。为…

PMP--知识卡片--波士顿矩阵

文章目录 记忆黑话概念作用图示 记忆 一说到波士顿就联想到波士顿龙虾,所以波士顿矩阵跟动物有关,狗,牛。 黑话 你公司的现金牛业务,正在逐渐变成瘦狗,应尽快采取收割策略;问题业务的储备太少&#xff0…

必须掌握的Linux的九大命令

ifconfig 命令用于配置和查看网络接口的参数。 ping 命令用于测试主机之间的网络连通性。 telnet用于通过Telnet协议连接到远程主机。 telnet 127.0.0.1 8000 telnet example.com telnet example.com 8080 iostat 命令用于报告 CPU 统计信息和 I/O 设备负载。 iostat&…

护眼热点:台灯护眼是真的吗?一起来看台灯的功能作用有哪些

如今近视问题日益严峻,尤为引人瞩目的是,高度近视学生群体占比已逼近10%的警戒线,且这一比例伴随着学龄的增长而悄然攀升——从幼儿园6岁孩童中那令人忧虑的1.5%,到高中阶段惊人的17.6%,每一组数据都敲响了保护儿童视力…

【Linux】静态库的制作和使用详解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

代码随想录算法训练营第71天:路径算法[1]

代码随想录算法训练营第71天:路径算法 ‍ bellman_ford之单源有限最短路 卡码网:96. 城市间货物运输 III(opens new window) 【题目描述】 某国为促进城市间经济交流,决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市&#xff0c…

【CT】LeetCode手撕—4. 寻找两个正序数组的中位数

目录 题目1- 思路2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 题目 原题连接:4. 寻找两个正序数组的中位数 1- 思路 思路 将寻找中位数 ——> 寻找两个合并数组的第 K 大 (K代表中位数) 实现 ① 遍历两个数组 &am…