多线程Thread(初阶三:线程的状态及线程安全)

目录

一、线程的状态

二、线程安全


一、线程的状态

1.NEW Thread:对象创建好了,但是还没有调用 start 方法在系统中创建线程。

2.TERMINATED: Thread 对象仍然存在,但是系统内部的线程已经执行完毕了。

3.RUNNABLE: 就绪状态,表示这个线程正在 cpu 上执行,或者准备就绪随时可以去 pu 上执行。

4.TIMED WAITING: 指定时间的阻塞.就在到达一定时间之后自动解除阻塞使用 sleep 会进入这个状态 使用带有超时时间的join也会。

5.WAITING: 不带时间的阻塞(死等),必须要满足一定的条件,才会解除阻塞join 或者 wait 都会进入 WAITING。

6.BLOCKED: 由于锁竞争,引起的阻塞.(后面线程安全的时候具体介绍)

这六种状态在生命周期的大概位置,如图:

用代码形式测试 NEW 、RUNNABLE、TERMINATED 状态

代码:

public class ThreadDemo3 {private static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {for (int i = 0; i < 5000; i++) {count++;}System.out.println("count: " + count);});//t线程开始前System.out.println("t线程开始前: " + t.getState());t.start();//t线程执行中System.out.println("t线程执行中: " + t.getState());//t线程结束后t.join();System.out.println("t线程结束后: " + t.getState());}
}

执行效果:

学习这些状态,最大的作用就是调试多线程代码bug的时候,给我们提供重要的参考依据当某个程序卡住了,也就是意味着一些关键的线程阻塞了,我们就可以观察线程的状态,分享出一些原因。

注意:一个线程只能start一次,也就是说只有是NEW状态的线程才能start。

二、线程安全

线程安全:某个代码,不管它是单个线程执行,还是多个线程执行,都不会产生bug,这个情况就成为“线程安全”。

线程不安全:某个代码,它单个线程执行,不会产生bug,但是多个线程执行,就会产生bug,这个情况就成为 “线程不安全”,或者 “存在线程安全问题”。

举个线程不安全例子,现在,我们想计算一个变量的自增次数,它循环了100000次,用两个线程去计算,各自计算循环50000次的次数。

代码:

public class ThreadDemo4 {private static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 1; i < 50000; i++) {count++;}});Thread t2 = new Thread(() -> {for (int i = 50000; i <= 100000; i++) {count++;}});t1.start();t2.start();t1.join();t2.join();System.out.println("count: " + count);}
}

我们知道,从1到10_0000,肯定是自增了10_0000次,但是我们看看输出结果如何?

答案却不是10_0000,是50000多次,这是为何呢?原因就是多线程代码,它们是并发执行的。

这个count++是由cpu的三个指令构成的:

(1)load 从内存中读取数据到cpu的寄存器中。

(2)add 把寄存器中的值 + 1。

(3)save 把寄存器中的值写回到内存中。

因为上面两个线程是并发执行的,那么 t1 和 t2 线程的执行顺序就是无序的,他们可能同时读取数据,自增完再+1,下面用图示他们的一些可能性。

暂时就画这么多,因为线程并发的执行结果个数是无数的,并不是简单的排列组合就能穷举出来,因为并发的原因,可能 t1 线程它执行了两次,才执行一次 t2 线程,也可能更多,或者 t2 执行的次数更多,t1 线程只执行一次。就又要排列组合了,这些情况都是有可能的。

这时,t1 和 t2自增的时候,就可能拿的是同一个值,这两线程的其中一个自增后,没放回内存中,另一个线程就又拿了,这肯定是不符合我们预期的。

所以我们从上面的可能情况找,符合我们预期的效果就只有这两个了,如图

那么这种情况也就是串行化执行,执行完 t1,再执行t2,或者两个顺序相反。

代码:

public class ThreadDemo4 {private static int count = 0;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 1; i < 50000; i++) {count++;}});Thread t2 = new Thread(() -> {try {t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}for (int i = 50000; i <= 100000; i++) {count++;}});t1.start();t2.start();t2.join();System.out.println("count: " + count);}
}

执行效果:

但这样就没必要使用多线程了,因为串行化,一个线程就能搞定了,使用多线程也没太大意义。

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

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

相关文章

雪花算法原理(设计原理、优缺点、如何改造它、以及应用)

雪花算法原理&#xff08;设计原理、优缺点、如何改造它、以及应用&#xff09; 雪花算法源码为什么雪花算法是 64 位&#xff1f;为什么时间戳是41位&#xff1f;占雪花算法的 43-47 bit 位为什么工作台最大只支持设置 31 &#xff1f;工作台设置成了 63 会导致什么后果&#…

Java 之 final 详解

目录 一. 前言 二. final 的基础使用 2.1. 修饰类 2.2. 修饰方法 2.2.1. private 方法是隐式的 final 2.2.2. final 方法可以被重载 2.3. 修饰参数 2.4. 修饰变量 2.4.1. static final 2.4.2. blank final 2.4.3. 所有 final 修饰的字段都是编译期常量吗&#xff1f…

数据结构:二叉查找树,平衡二叉树AVLTree,红黑树RBTree,平衡多路查找数B-Tree,B+Tree

二叉查找树 二叉树具有以下性质&#xff1a;左子树的键值小于根的键值&#xff0c;右子树的键值大于根的键值。 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1&#xff0c;深度为2的查找次数为2&#xff0c;深度为n的节点的查找次数为n&#xff0c;因此其平均查找次…

2023年亚太数学建模C题数据分享+详细思路

在报名截止的前一天&#xff0c;我尝试进行了报名。到那时&#xff0c;已有11,000个队伍注册参赛。在我的了解中&#xff0c;在数模比赛中除了国赛美赛外&#xff0c;几乎没有其他竞赛的参赛队伍数量能与此相媲美。即便不考虑赛题的难度和认可度&#xff0c;亚太地区的这场竞赛…

JavaScript实现动态背景颜色

JavaScript实现动态背景颜色 前言实现过程HTML实现过程CSS实现过程JS实现过程全部源码 前言 本文主要讲解JavaScript如何实现动态背景颜色&#xff0c;可以根据颜色选择器选择的颜色而实时更新到背景中&#xff0c;如下图所示。 当我们在颜色选择器中改变颜色时&#xff0c;会…

SPSS信度分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

内网渗透之Linux权限提升大法

文章目录 内网渗透|Linux权限提升大法0x01 前言0x02 工具介绍1.traitor2.LinEnum3.linux-exploit-suggester.sh4.Linux Exploit Suggester 25.beroot 0X02提权手法1.环境变量提权2.利用suid提权3.定时任务提权3.1定时任务文件覆盖提权3.2定时任务tar命令通配符注入提权 4.sudo提…

【matlab程序】matlab给风速添加图例大小

【matlab程序】matlab给风速添加图例大小 clear;clc;close all; % load 加载风速数据。 load(matlab.mat) % 加载颜色包信息 gray load(D:\matlab_work\函数名为colormore的颜色索引表制作\R_color_txt\R_color_single\gray89.txt); brown load(D:\matlab_work\函数名为color…

_STORAGE_WRITE_ERROR_ thinkphp报错问题原因

整个报错内容如下 Uncaught exception Think\Exception with message _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/1338db9dec777aab181d4e74d1bdf964.php in C:\inetpub\wwwroot\ThinkPHP\Common\functions.php:101 Stack trace: #0 C:\inetpub\wwwroot\ThinkPHP\Library\…

JavaFx 设置窗口边框圆角

UI界面要求窗口边框有一定弧度&#xff0c;因为之前没有做过&#xff0c;网上看了很多文章&#xff0c;都用到了css语句 "-fx-background-radius: ; 我在xml布局文件根节点使用无效&#xff0c;在Scene组件设置无效&#xff0c;gpt等ai问了一圈代码也是无效&#xff0c;…

【JavaEE】认识多线程

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《vaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&am…

React + BraftEditor 实现富文本编辑

Braft Editor 是一个基于 React 和 Draft-js 开发的富文本编辑器&#xff0c;提供了丰富的基础功能&#xff0c;如基本文本格式化、列表、链接、图片上传、视频插入等&#xff0c;并且还支持扩展。 首先&#xff0c;确保你已经在项目中安装了 Braft Editor 和它的依赖项&#x…

NPU、CPU、GPU算力及算力计算方式

NVIDIA在9月20日发布的NVIDIA DRIVE Thor 新一代集中式车载计算平台&#xff0c;可在单个安全、可靠的系统上运行高级驾驶员辅助应用和车载信息娱乐应用。提供 2000 万亿次浮点运算性能&#xff08;2000 万亿次8位浮点运算&#xff09;。NVIDIA当代产品是Orin&#xff0c;算力是…

堪比数据恢复大师软件推荐,恢复数据很简单!

“作为一个经常丢失数据的电脑用户来说&#xff0c;我觉得我非常需要一些简单有效的数据恢复方法。大家有什么比较靠谱的软件推荐吗&#xff1f;非常感谢&#xff01;” 在数字化时代&#xff0c;数据的存储是比较重要的。很多用户都会选择将重要的文件保存在电脑上。如果数据丢…

第二证券:北证50指数一枝独秀 短剧游戏概念股持续活跃

周三&#xff0c;沪深两市三大指数颤动调整&#xff0c;北证50指数“鹤立鸡群”&#xff0c;大涨超8%。到收盘&#xff0c;上证综指报3043.61点&#xff0c;跌0.79%&#xff1b;深证成指报9855.66点&#xff0c;跌1.41%&#xff1b;创业板指报1950.01点&#xff0c;跌1.73%。沪…

uni-app,nvue中text标签文本超出宽度不换行问题解决

复现&#xff1a;思路&#xff1a; 将text标签换为rich-text&#xff0c;并给rich-text增加换行的样式class类名解决&#xff1a;

【Vue】浏览器安装vue插件

首先看一下安装之后的效果&#xff0c;再考虑一下要不要安装 安装完之后&#xff0c;打开浏览器控制台&#xff08;ctrl shift j) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</t…

HOOPS Web平台助力开发3D应用,实现超大规模3D web轻量化渲染与数据格式转换!

一、包含的软件开发工具包 HOOPS Web平台帮助开发人员构建基于Web的工程应用程序&#xff0c;提供高级3D Web可视化、准确快速的CAD数据访问和3D数据发布。 HOOPS Web平台包括三个集成软件开发工具包 (SDK)&#xff1a; &#xff08;1&#xff09;Web端3D可视化引擎 HOOPSCom…

mysql查询表的字段,字段名以及注释sql语句

sql语句如下&#xff1a; selecta.ordinal_position 序号,a.COLUMN_name 字段名,a.COLUMN_type 字段类型,(case a.is_nullable when NO then 是 else 否 end) 是否非空,(case a.column_key when PRI then 是 else 否 end) 是否主键,a.COLumn_comment 注释 frominformation_sch…

【C/C++】素数专题

素数专题 1.判断素数模板2.求范围内的素数&#xff08;101-200&#xff09;3.判断素数与分解 1.判断素数模板 #include<stdio.h> #include<math.h>int prism(int n){if(n1) return 0;for(int i2;i<sqrt(n);i){if(n%i0) return 0;}return 1; }int main() {int n…