笔记(day21) 多线程以及锁的概念(超级完整版)

news2024/11/24 15:16:47

一、 多线程

1.1 程序,进程,线程

程序:一堆命令的集合,完成某个特定任务,是静态的,保存在硬盘中

进程:是程序的一次执行过程,就是把程序载入内存中执行,就是进程,是动态的

线程:是进程进一步细化,是程序内部的一条执行分支

如果一个进程同一时间执行多个线程,就是支持多线程

我们现在的java程序,运行的时候,main就是执行的开始,在栈内存中开启main栈帧的时候,就是开启了一个线程

一个线程就是一个栈及栈中的链式栈帧调用,当栈底元素弹栈后,则线程终止

以main方法为栈底元素的栈帧,称为主线程

CPU时间片,把CPU5次执行的时间当成一个基本单位,然后给每个进程分配时间片,这个由操作系统决定

一般是根据我们设定的优先级进行分配

1.2 并行和并发

并发:同时发生,一个CPU同时执行多个任务

并行:同时执行,多个CPU同时执行多个任务

1.3 单核CPU和多核CPU

a) 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程 的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费 才能通过,那么CPU就好比收费人员。如果有某个人不想交钱,那么收费人员可以 把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时 间单元特别短,因此感觉不出来。

b) 如果是多核的话,才能更好的发挥多线程的效率。(现在的服务器都是多核的)

c) 一个Java应用程序java.exe,其实至少有三个线程:main()主线程,gc() 垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。

1.4 多线程优缺点和应用场景

背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方 法),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?

多线程程序的优点:

  1. 提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
  2. 提高计算机系统CPU的利用率
  3. 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和

修改

  • 程序需要同时执行两个或多个任务。

  • 程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等。

  • 需要一些后台运行的程序时。

1.5 线程创建

创建线程有两种方式,但是启动线程只有一种方式

1 继承thread类,并覆写run方法

2 实现runnable接口,并实现run方法

3 启动只有一种,就是调用线程对象的start()方法

1.5.1 thread

image-20240815183636945

1.5.2 runnable

image-20240815183712105

1.5.3 继承和实现的区别

public class *Thread* extends Object implements Runnable

区别

  • 继承Thread:线程代码存放Thread子类run方法中。
  • 实现Runnable:线程代码存在接口的子类的run方法。

实现方式的好处

  • 避免了单继承的局限性
  • 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线 程来处理同一份资源。

1.6 优先级和常用方法

1.6.1 优先级概述

线程的优先级等级

a) MAX_PRIORITY:10

b) MIN _PRIORITY:1

c) NORM_PRIORITY:5

涉及的方法

d) ***getPriority() :***返回线程优先值

e) ***setPriority(int newPriority) :***改变线程的优先级

说明

f) 线程创建时继承父线程的优先级

g) 低优先级只是获得调度的概率低,并非一定是在高优先级线程之后才被调用

1.6.2 使用方式

image-20240815184033902

image-20240815184041375

1.7 生命周期

JDK中用Thread.State类定义了线程的几种状态

要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类 及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五 种状态

新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建 状态

***就绪:***处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源

***运行:***当就绪的线程被调度并获得CPU资源时,便进入运行状态, run()方法定义了线 程的操作和功能

***阻塞:***在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中止自己的执行,进入阻塞状态

***死亡:***线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束

image-20240815184201210

1.8 线程控制

image-20240815184220642

1.8.1 sleep

image-20240815184247779

1.8.2 线程停止stop

image-20240815184317907

image-20240815184329011

1.8.3 线程合并join

image-20240815184350933

image-20240815184356887

1.8.4 yield

thread.yield静态方法,暂停当前正在执行的进程,并让其他进程执行

1 静态,就意味着写在哪个进程,就暂停在哪个进程

2 只给相同优先级让位

  • 按下Win+R键,输入“msconfig”并回车打开系统配置。
  • 选择“引导”选项卡,然后点击“高级选项”。
  • 在处理器数下拉菜单中选择“1”,然后点击确定并重启电脑。

image-20240815184623620

1.9 线程同步

1.9.1 概述

问题的提出

多个线程执行的不确定性引起执行结果的不稳定

多个线程对账本的共享,会造成操作的不完整性,会破坏数据

image-20240815184714173

1.9.2 不同步带来的影响

image-20240815184740029

image-20240815184747519

image-20240815184756304

image-20240815184805897

image-20240815184811505

image-20240815184816491

1.9.3 解决方法

当多个线程,有可能同时操作某一个数据的时候(非查询操作),为了保证数据的一致性和正确性,需要进行同步执行

是一种数据安全机制

1.9.3.1 方法锁

synchronized修饰符,用于给方法加锁,多个线程不能同时访问该对象中加锁的方法

如果访问一个对象中加锁的成员方法/对象语句块,则改对象中"所有加锁的成员方法及对象语句块锁,全部锁定"

如果访问一个类中加锁的静态方法/类语句块锁,则该类中"所有加锁的静态方法及类锁,全部锁定"

synchronized(对象){}对象语句块锁

synchronized(类.class){} 类语句块锁

image-20240815185758519

1.9.3.2 语句块锁

​ // 方法锁,该方法别的线程进不来,在方法外排队等待

​ // 如果方法中代码比较多,而且仅仅只有一部分代码需要同步,那么使用方法锁会大大降低运行效率

​ // 此时可以使用语句块锁,只锁需要同步的代码即可

image-20240815185830950

1.10 lock

1.10.1 概述

  • 从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同

​ 步锁对象来实现同步。同步锁使用Lock对象充当。

  • java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象。

  • ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁。

1.10.2 使用

image-20240815185946859

1.10.3 优缺点

Lock锁是显示锁(需要手动加锁和解锁)

Synchronized是隐式锁,自动加锁解锁

使用Lock锁,JVM可以花费更少的时间来调度线程,并且提供了很多子类,有更好的扩展性

1.11 定时器任务

1.11.1 概述

定时器,计划任务,会开启新线程进行计时,时间到了之后,会开启新线程来执行规定的任务

1.11.2 使用

image-20240815190049011

1.10.3 优缺点

Lock锁是显示锁(需要手动加锁和解锁)

Synchronized是隐式锁,自动加锁解锁

使用Lock锁,JVM可以花费更少的时间来调度线程,并且提供了很多子类,有更好的扩展性

1.11 定时器任务

1.11.1 概述

定时器,计划任务,会开启新线程进行计时,时间到了之后,会开启新线程来执行规定的任务

1.11.2 使用

[外链图片转存中…(img-IQ0YT0qz-1723808026507)]

暂时先到这里啦!!! 剩下的明天补充

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

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

相关文章

简单测试AOP五种增强执行时机

1. 目标方法类,spring代理bean Component public class Test {public void test(){System.out.println("test 目标方法");}public void testException(){throw new RuntimeException();} } 2. 配置类 Configuration ComponentScan EnableAspectJAutoPr…

查询满足连续任意30天的全量交易的多个商户

需求说明: 先说表结构把,就是一张订单表存了商户号和其他相关信息,现在要查询这个订单表中以商户为主体的连续交易,也就是每天产生至少一笔订单的商户才算连续,不知道看到的小伙伴有没有什么想法和头绪,在一…

【C++进阶】map与set的封装实践

文章目录 map和setmapmap的框架迭代器operator()operator--()operator()和operator!()operator*()operator->() insertbegin()end()operator[] ()map的所有代码: set的封装迭代器的封装总结 map和set 通过观察stl的底层我们可以看见,map和set是通过红…

ubuntu16.04安装ibus拼音 输入法

前言 开始尝试搜狗输入,发现问题很多,放弃。网上说ibus比较稳定,决定安装ibus输入法。 步骤 安装ibus,使用如下命令, 安装完重启系统,使ibus生效; sudo apt install ibus ibus-pinyin ibus-table ibus-…

maven项目删除pom文件的依赖仍存留在项目中的解决方案【已解决】

前言 使用了pagehelper和mybatisplus的分页插件,起冲突了,想着注释掉pagehelper然后刷新maven,发现一直存留 mlgbz的 试了好多方法,什么缓存乱七八糟的,我以为出bug了 解决

Fiddle抓手机app的包

前言 本次文章讲述的是,fiddle获取手机代理,从而获取手机app的http、https请求! 一.下载安装汉化Fiddle 1.点击Fiddler官网下载链接:Download Fiddler Web Debugging Tool for Free by Telerik 2.直接运行,选择自己需…

CUDA C++ 编程指南学习

CUDA C 编程指南 (nvidia.com)https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 2. 编程模型 2.1. 内核 CUDA C 扩展了 C,允许程序员定义 C 函数,称为内核,当被调用时,N 个不同的 CUDA 线程并行执行 N 次&am…

2023卫星视频综述论文Recent Advances in Intelligent Processing of Satellite Video

2023卫星视频综述论文Recent Advances in Intelligent Processing of Satellite Video 1.摘要2.引言3. 文章的定量分析4 难点与挑战5 方法论系统A. 卫星视频观察的特点B. 卫星视频目标跟踪与运动估计C. 卫星视频目标检测D. 卫星视频超分辨率 (VSR)E. 卫星视频目标分割&#xff…

Idea新建Spring Initializr项目文件哪些可删

​ .gitignore 用git做版本控制时 用这个文件控制那些文件或文件夹 不被提交(不用git的话可删除 没影响)HELP.md md是一种文档格式 这个就是你项目的帮助文档(可删除 没影响) mvnw linux上处理mevan版本兼容问题的脚本&#xff0…

企业高性能web服务器

web服务器介绍 Apache HTTP Server:也称为Apache,是一个开源的HTTP服务器,目前是全球使用最广泛的Web服务器 Nginx:Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Microsoft Internet Inform…

LVS原理详解及实战部署

一、LVS简介 LVS(Linux Virtual Server)是一种基于Linux的高性能虚拟服务器集群系统,主要用于实现负载均衡。LVS通过Linux内核中的IPVS模块实现了基干!P负载均衡的功能,能够将来自网络的请求分配给后端的多个服务器,从而提供高可用性和伸缩性…

Linux系统编程:线程 3:信号量

1.信号量的概念 信号量是线程间有顺序的协调工作,信号量 (个数) 反映的是资源的数量,信号量起到锁的效果; 2.信号量的机制 (1)信号量描述可使用资源的个数; (2)p操作&#xff0c…

第二证券:全球首款双人互动剧上线 暑期游戏持续升温

全球首款双人互动剧上线 全球首款双人互动剧《谍影成双》现已在全球游戏渠道Steam、微信小程序、QQ小程序同步上线。根据上海影视乐园官方大众号,该作是2023年度爆款互动剧《飞越13号房》制造团队互影科技的全新著作。 2023年被称为互动剧的元年,“互动…

python学习day15地图、柱状图

地图、柱状图 地图示例 柱状图XY轴反转小结 时间线柱状图自动播放小结 动态柱状图sort排序练习动态柱状图 地图 from pyecharts.charts import Map mapMap() data[(北京市,999),(上海市,133),(河南省,123),(西藏自治区,123),(吉林省,12), ]map.add("地图",data,"…

ElasticSearch数据建模

文章目录 如何处理关联关系避免过多字段避免正则/通配符/前缀查询避免空值引起的聚合不准为索引的Mapping加入Meta 信息 如何处理关联关系 Object: 优先考虑反范式(Denormalization) Nested: 当数据包含多数值对象,同时有查询需求 Child/Pa…

SAP BAPI for Tcode SM12

注意:ENQUE_READ 和 ENQUE_READ2 的table ENQ是两个不同的结构 想通过 ENQUE_READ2 读取结构然后去删除 ENQUE_DELETE的 要注意不能直接用 要用 ENQUE_CONVERT_SEQG7_TO_SEQG3 进行转换 FUNCTION ENQUE_CONVERT_SEQG7_TO_SEQG3. *"-----------------------…

[000-01-030].第2节 :Zookeeper本地安装

1.Zookeeper下载地址 1.Zookeeper官网地址 2.会显示Zookeeper的一些版本 2.Zookeeper本地模式安装: 2.1.Zookeeper安装前准备 1.在Centos7虚拟机中安装jdk8 2.2.Zookeeper安装过程: 1.下载zookeeper压缩版本,解压放在opt/moduel目录下…

为啥90%设计师素材整理文件夹都是无效的?

大家好,今天我想和大家分享一下我在使用千鹿设计助手软件之前的图片管理经历,以及千鹿给我带来的巨大变化。 正文: 大家好,今天我想和大家分享一下我在使用千鹿软件之前的图片管理经历,以及千鹿给我带来的巨大变化。 …

netCDF文件预览(nc格式)

1.工具下载 软件下载:https://download.csdn.net/download/qq_34321590/89645482 2.java11环境安装 需要安装java11以上版本 安装包下载: https://download.csdn.net/download/qq_34321590/89645487 安装步骤: 1.解压 2.配置环境变量 在…

针对老年人的景区订票系统

TOC springboot303针对老年人的景区订票系统 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,…