进程和线程、线程安全

article/2025/10/17 22:55:56

进程和线程

一个程序就是一个进程,而一个程序中的多个任务则被称为线程。

进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位。

实现多线程编程的方式有两种,一种是继承 Thread 类,另一种是实现 Runnable 接口。使用继承 Thread 类创建线程,最大的局限就是不能多继承,所以为了支持多继承,完全可以实现 Runnable 接口的方式。需要说明的是,这两种方式在工作时的性质都是一样的,没有本质的区别。

虽然系统是把资源分给进程,但是CPU很特殊,是被分配到线程的,所以线程是CPU分配的基本单位。

二者关系:

一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域。

img

二者区别:

进程:有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。

线程:是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

程序计数器:是一块内存区域,用来记录线程当前要执行的指令地址 。

:用于存储该线程的局部变量,这些局部变量是该线程私有的,除此之外还用来存放线程的调用栈祯。

:是一个进程中最大的一块内存,堆是被进程中的所有线程共享的。

方法区:则用来存放 NM 加载的类、常量及静态变量等信息,也是线程共享的 。

线程安全

1、线程安全问题:

img

多个线程同时操作共享变量1时,会出现线程1更新共享变量1的值,但是其他线程获取到的是共享变量没有被更新之前的值。就会导致数据不准确问题。

2、共享内存不可见性问题

img

Java 内存模型规定,将所有的变量都存放在主内存中,当线程使用变量时,会把主内存里面的变量复制到自己的工作空间或者叫作工作内存,线程读写变量时操作的是自己工作内存中的变量 。(如上图所示)

img

(实际工作的java内存模型)

上图中所示是一个双核 CPU 系统架构,每个核有自己的控制器和运算器,其中控制器包含一组寄存器和操作控制器,运算器执行算术逻辅运算。CPU的每个核都有自己的一级缓存,在有些架构里面还有一个所有CPU都共享的二级缓存。 那么Java内存模型里面的工作内存,就对应这里的 Ll或者 L2 缓存或者 CPU 的寄存器。

Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。变量的值何时从线程的工作内存写回主存,无法确定。

1、线程A首先获取共享变量X的值,由于两级Cache都没有命中,所以加载主内存中X的值,假如为0。然后把X=0的值缓存到两级缓存,线程A修改X的值为1,然后将其写入两级Cache,并且刷新到主内存。线程A操作完毕后,线程A所在的CPU的两级Cache内和主内存里面的X的值都是l。

2、线程B获取X的值,首先一级缓存没有命中,然后看二级缓存,二级缓存命中了,所以返回X=1;到这里一切都是正常的,因为这时候主内存中也是X=l。然后线程B修改X的值为2,并将其存放到线程2所在的一级Cache和共享二级Cache中,最后更新主内存中X的值为2,到这里一切都是好的。

3、线程A这次又需要修改X的值,获取时一级缓存命中,并且X=l这里问题就出现了,明明线程B已经把X的值修改为2,为何线程A获取的还是l呢?这就是共享变量的内存不可见问题,也就是线程B写入的值对线程A不可见。

 

线程状态:

 

其实我们可以理解为两种状态,一个是running,表示正在执行,一个是runable,表示准备就绪了,只是在等待其他的系统资源。然后我们就可以理解如下图

img

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

原文链接:https://blog.csdn.net/qq_36711757/article/details/82384356

 线程调度调度策略: 时间片:线程的调度采用时间片轮转的方式 抢占式:高优先级的线程抢占CPU Java的调度方法: 1.对于同优先级的线程组成先进先出队列(先到先服务),使用时间片策略 2.对高优先级,使用优先调度的抢占式策略 线程的优先级 等级: MAX_PRIORITY:10 MIN_PRIORITY:1 NORM_PRIORITY:5 高优先级的线程要抢占低优先级的线程的cpu的执行权。但是仅是从概率上来说的,高优先级的线程更有可能被执行。并不意味着只有高优先级的线程执行完以后,低优先级的线程才执行。


http://chatgpt.dhexx.cn/article/Uu4mT8HW.shtml

相关文章

解决qq安全防护更新进程总提示的方法

怎么关闭qq防护更新进程窗口呢?此文就为大家分享解决qq安全防护更新进程关闭的方法。   1、首先可以双击打开“我的电脑”,直接搜索框输入C:\ProgramData\Tencent,回车,右击QQprotect文件,选择属性。 2、然后可以在页…

屏蔽QQ安全防护进程

转载于:https://www.cnblogs.com/dobbin2018/p/9899568.html

qq安全保护进程更改计算机,分享win10电脑系统关闭qq安全防护进程的步骤

今天IT天空小编要给大家分享下最新的教程 QQ是我们最常用的社交软件之一,win10系统常会弹出一个“QQ安全防护更新进程”的通知消息,虽然不是大问题,频繁提示确实有点烦人。那么win10系统关闭qq安全防护进程?关闭步骤有点麻烦&…

永久删除掉qq安全防护进程q盾

这个用不用qq都可以删,太占我内存了,今天实在受不了就清理了一下占内存的进程 步骤: 1.现在进程中结束Q盾进程 2.右键 “此电脑”,选择 “管理 - 服务和应用程序 - 服务”,找到 “QPCore Service”,禁用 …

win10电脑启动QQ/TIM遇到QQ安全防护进程,打不开TIM/QQ解决方法

启动QQ或者TIM时出现的界面 解决办法 1.winR 输入services.msc–按下回车键 2.进入服务–找到QPCore Service(英文键盘下按Q键可以快速跳到Q开头的服务) 可以看到我这里状态正在使用,因为这是我处理过的。打不开QQ的这里应该没有任何东西出现…

视图--sql String类型的日期数据如何与当前日期比较查询

日期数据在Sql Server数据库中不都是以日期类型保存的,如果数据库中保存日期字段的数据类型为varchar,而你又需要对这个日期和另外一个日期进行比较,那么该怎么办呢?总结有以下方法 (1)方法一 这个方法很…

sqlserver中比较日期大小

起始日期和终止日期,相信聪明的你肯定可以想象出为什么要有两个日期控件!是的,就是从一张表中查找出在这两个日期范围类的记录! 有的人就说了,这还不简单! 假如我们将第一个控件定义成Begin,第…

SQL日期函数

一、知识点 在SQL中,由于不能直接执行算术函数,所以日期函数在SQL就十分有用。 日期函数拥有多个方法,每个方法都可以对日期进行查改或计算。 比如: GETDATE()方法,获取当前的系统日期。DATEADD(日期部分,number,date…

手动编译kernel和supplicant使树莓派支持wpa3

目前支持wpa3的client毕竟还少,因此决定用树莓派作为wpa3 client,同时为了方便分析wpa3有关的supplicant和 kernel的代码流程,决定手动编译。 编译之前需要下载树莓派对应的工具链和driver patch。 https://community.cypress.com/docs/DOC…

学一点Wi-Fi:WPA3 BP/OCV/SCV/PK/H2E/TD

WFA在2020年底发布了WPA3标准的第三版,其中又提出了一些新的feature。这里结合之前的版本简单总结一下。 1. BP BP是Beacon Protection的缩写。 问:Beacon中的信息都是未加密的,所以可能存在攻击者会对AP发出的Beacon信息进行篡改。 解&a…

针对WPA3认证的802.11协议分析

i 一、对管理帧的关键参数分析 AP的认证方式,可通过802.11管理帧(Beacon帧、Probe Response帧)中的相关参数进行判断,以WPA/WPA2-Persoanl类型的AP为例进行具体说明: Beacon帧(主动扫描&#xff0…

【Hostapd support for WPA3 R3 Wi-Fi Security】

概述 WiFi 联盟将从 2022 年 1 月开始强制要求 WPA3 R3 进行认证。现有的 wpa_supplicant v2.9 和 hostapd v2.9 及以下版本不支持 WPA3-R3。需更新到hostapd v2.10版本以上才支持。 笔记 1.Wi-Fi联盟推出了被称为WPA3 R3版本,其中提出了Hash to Element(H2E)作为…

第十七节:通信之WLAN(WPA3-Ⅰ)

欢迎大家一起学习探讨通信之WLAN。本节探讨关于WLAN的安全性,最新WLAN加密方式为WPA3(Wi-Fi Protected Access 3),相对WPA2在WLAN网络数据安全方面提供更好的保护机制。WPA3加密方式分为企业模式和个人模式,本节重点讨论WPA3个人模…

WPA3也不安全啦?H2E了解一下

一、背景 借用权威大佬的一句话,这一切都是妥协。 WPA2方法被称为Wi-Fi最先进的加密协议从2004年到2018年整整14个年头,但是这期间被各种花样攻击,各种被攻破。终于在2018年联盟推出了WPA3加密协议,协议一推出,各大媒体…

WPA3之OWE

大概是WIFI联盟的人闲的蛋疼,折腾出一个WPA3模式。想解决什么问题呢?看到WPA就知道是安全问题。大家总认WIFI输入密码麻烦,比如公共场所上网,先看墙上或者桌子上哪里有密码提示。营运商也觉得很烦,于是不知不觉在机场和…

WPA2/WPA3混合与WPA3的hostapd配置区别

WPA3-Personal-only mode: ieee80211w2 and wpa_key_mgmtSAE WPA2/WPA3: ieee80211w2 and wpa_key_mgmtWPA-PSK SAE 关于ieee80211w: 关于wpa: hostapd配置文件详细介绍 hostap-wpa3/hostapd.conf at master vanhoefm/hostap-wpa3 GitHub

关于WPA3-H2E的技术讲解

序言 H2E是Hash-To-Element的缩写。 问:虽然使用WPA3 SAE解决了offline dictionary破解密钥的问题,但是原先用于生成PMK的算法在计算时间上和密钥有关联性(这也行?),仍然存在所谓被side-channel方式破解。 解:新的算法,使用hash计算一次即可,堵死这个理论缺口[4]。…

WPA3 vs WPA2

1. 背景 2017年10月份,有安全研究者公布了WPA2协议的一个弱点,会遭受到KRACK( Key Reinstallation AttaCK)攻击;攻击者可以获取STA和AP之间传输的数据,许多厂家已经发布相关补丁修复此漏洞;但是WPA2的形象和名声还是受到损害,因而WIFI联盟迅速推出了WPA3 2018年的6月…

[高通SDM450][Android9.0]设备默认支持连接WPA3-SAE加密协议的WIFI

文章目录 开发平台基本信息问题描述问题分析解决方法 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 前段时间,有个医院的客户反馈我们的设备无法连接上他们医院路由器的WIFI,并且设备显示wifi已保存,但就是…

WIFI驱动开发——WIFI支持WPA3连接

Linux Kernel Support WPA3 文章目录 Linux Kernel Support WPA31. WPA3是什么2. WPA3相对于WPA2改进的地方3. 如何使用WPA33.1 驱动加载确认3.2 编译生成wpa_supplicant,hostapd工具3.3 STA模式下,连接WPA3加密的WIFI3.3.1 wpa_supplicant的使用3.3.2 w…