3.5多线程

news2024/11/15 11:51:53

一.线程的状态

1.NEW

安排了工作,还未开始行动

把Thread对象创建好了,但是还没有调用start

java内部搞出来的状态,与PCB的状态没什么关系

2.TERMINATED

工作完成了

操作系统的线程执行完毕,销毁了,但是Thread对象还在,获取的对象

3.RUNNABLE

可以工作的,又可以分为正在工作中和即将开始工作

也就是就绪状态

处在这个状态的线程,就是在就绪队列中

随时可以被调度到CPU上

如果代码中没有进行sleep.也没有其他的可能导致阻塞的操作,代码大概率是处在runnable操作

4.TIMED_WAITING

这几个表示排队等着其他事情

代码中调用了sleep,就会进入到TIMED_WAITING

join(超时时间)

意思就是当前线程在一定时间之内是阻塞状态

到了一定时间.阻塞状态解除的意思

5.BLOCKED

这几个都表示排队等着做其他事情

当前线程在等待锁,导致了阻塞- -----------synchroized

6.WAITING:

表示排队等着其他事情

当前线程等待唤醒,导致了阻塞---------------------wait

7.线程状态转换

二.线程安全问题

操作系统调度线程的时候,是随机的(抢占式执行)

所以可能导致程序的执行出现一些bug

如果是因为这样的调度随机性引入了bug.那么就认为线程是不安全的

1.线程不安全典型案例

为什么结果不是10_0000呢

因为可能是t1和t2同时增加一个变量的时候就会值加一次

2.CPU的原理

count++

站在cpu的角度来看,其实是三个指令

1.把内存里额度count的值.放到CPU寄存器里-----load

2.把寄存器中的值给+1

3.把寄存器的值写回内存的count中

正是因为前面说的"抢占式执行,这就导致了两个线程同时执行这三个指令的时候,顺序充满了随机性

3.解决线程安全问题-上锁

在自增之前,先加锁--lock

自增之后,再解锁 ---unlock

t1把这把锁占用,此时t2尝试lock就会阻塞

lock会一直阻塞,直到t1线程执行了unlock

通过这里的阻塞就把乱序额并发变成了一个串行操作

4.加锁的方式

1) synchronized

表示进入方法,就会自动加锁,离开方法就会自动解锁

当一个线程加锁成功的时候,其他线程尝试加锁,就会触发阻塞等待,

此时对应的线程就处在BLOCKED状态

这个阻塞会一直持续到,占用锁的线程把锁释放

5.线程不安全原因

1.线程是抢占式执行.线程之间的调度充满随机性

2.多个线程对同一变量进行修改操作

3.针对变量的操作不是原子的

(可以类比数据库的事务)

针对有些操作,比如读变量的值,只是对应一条机器指令,这样的操作本身可以视为原子性

通过加锁操作,也就把好几个指令打包成一个原子的

4.内存可见性

举例:针对同一个遍历.一个线程进行读操作,(循环很多次)

一个线程进行修改操作(合适的时候执行一次)

这就是java编译器产生的代码优化产生的效果

6.预防内存可见性

始终无法判断isquit已经变了,因为这里编译器已经悄悄优化了

1.使用synchronized关键字

synchronized不光能保证指令的原子性,同时也保证了内存的可见性

被synchronized包裹起来的代码,编译器就不敢轻易优化

2.使用volatile关键字

volatile与原子性无关,但是能够保证内存可见性,禁止编译器做出上述优化

7.指令重排序

也是编译器优化的操作

编译器会能调整代码的前后顺序

保证逻辑不变的情况下,调整,提高程序执行的顺序

可以用synchronized不光能保证原子性,还能保证内存可见性,同时还能禁止指令重排序

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

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

相关文章

聊聊内存那些事(基于单片机系统)

单片机的RAM和ROM单片机的ROM,叫只读程序存储器,是FLASH存储器构成的,如U盘就是FLASH存储器。所以,FLASH和ROM是同义的。单片机的程序,就是写到FLASH中了。而RAM是随机读/写存储器,用作数据存储器&#xff…

SpringBoot笔记(一)入门使用

一、为什么用SpringBootSpringBoot优点创建独立Spring应用内嵌web服务器自动starter依赖,简化构建配置自动配置Spring以及第三方功能提供生产级别的监控、健康检查及外部化配置无代码生成、无需编写XMLSpringBoot缺点人称版本帝,迭代快,需要时…

电路基础(1)电路模型和电路定律

电路中的电压、电流之间具有两种约束,一种是由电路元件决定的元件约束;另一种是元件间连接而引入的几何约束(就是拓扑约束),后者由基尔霍夫定律来表达。基尔霍夫定律是集总参数电路的基本定律。 1.电路和电路模型电源又…

电路模型和电路定律(2)——“电路分析”

各位CSDN的uu们你们好呀,好久没有更新电路分析的文章啦,今天来小小复习一波,之前那篇博客,小雅兰更新了电路的历史以及电压电流的参考方向,这篇博客小雅兰继续!!! 电阻元件 电压源和…

FFMPEG 安装教程windowslinux(CentOS版)

ps: 从笔记中迁移至blog 版本概述 Windows 基于win10 Linux 基于CentOS 7.6 一.Windows安装笔记 1.下载安装 https://ffmpeg.org/download.html 2 解压缩,拷贝到需要目录,重命名 3 追加环境变量 echo %PATH%setx /m PATH "%PATH%;F:\dev_tools\…

用C/C++制作一个简单的俄罗斯方块小游戏

用C/C制作一个简单的俄罗斯方块小游戏 用C/C制作一个简单的俄罗斯方块小游戏 0 准备1 游戏界面设计 1.1 界面布局1.2 用 EasyX 显示界面1.3 音乐播放 2 方块设计 2.1 方块显示2.2 随机生成一个方块2.3 方块记录 3 方块移动和旋转 3.1 方块的移动3.2 方块的旋转3.3 方块的碰撞和…

基于 WebSocket、Spring Boot 教你实现“QQ聊天功能”的底层简易demo

目录 前言 一、分析 1.1、qq聊天功能分析 1.2、WebSocket介绍 1.2.1、什么是消息推送呢? 1.2.2、原理解析 1.2.3、报文格式 二、简易demo 2.1、后端实现 2.1.1、引入依赖 2.1.2、继承TextWebSocketHandler 2.1.3、实现 WebSocketConfigurer 接口 2.2、…

LeetCode096不同的二叉搜索树(相关话题:卡特兰数)

目录 题目描述 解题思路 代码实现 进出栈序列理解卡特兰数分析策略 相关知识 参考文章 题目描述 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: …

《程序员面试金典(第6版)》面试题 02.07. 链表相交

题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果…

socket本地多进程通信基本使用方法和示例

目录 前言: socket是什么 socket基本原理框图 socket基本函数 1 socket() 函数 2 bind()函数 3 connect()函数 4 listen() 函数 5 accept() 函数 6 read() write() send() recv()函数 7 close()函数 8 字节序转换(hton) 示例代码 …

使用 Pulumi 打造自己的多云管理平台

前言在公有云技术与产品飞速发展的时代,业务对于其自身的可用性提出了越来越高的要求,当跨区域容灾已经无法满足业务需求的情况下,我们通常会考虑多云部署我们的业务平台,以规避更大规模的风险。但在多云平台部署的架构下&#xf…

埃安自研版图扩至夸克电驱,动力研发团队已超1000人

埃安的三电自研版图正在扩大。3月3日,广汽集团旗下埃安发布了一项名为“夸克电驱”的技术产品,相比主流电驱体积减少一倍,同时电机功率密度比主流电驱增加了一倍。此前,比亚迪刚刚发布易四方动力系统,特斯拉也在投资者…

HTML常见标签

文章目录一、HTML基础标签注释标签标题标签段落标签换行标签格式化标签图片、音频、视频标签超链接标签列表标签表格标签布局标签表单标签表单标签概述form标签属性表单项标签综合案例一、HTML基础标签 基础标签就是和文字相关的标签 标签描述<h1> ~ <h6>定义标题…

【项目管理】晋升为领导后,如何开展工作?

兵随将转&#xff0c;作为管理者&#xff0c;你可以不知道下属的短处&#xff0c;却不能不知道下属的长处。晋升为领导后&#xff0c;如何开展工作呢&#xff1f; 金九银十&#xff0c;此期间换工作的人不在少数。有几位朋友最近都换了公司&#xff0c;职位得到晋升&#xff0c…

前端——1.相关概念

这篇文章主要介绍前端入门的相关概念 1.网页 1.1什么是网页&#xff1f; 网站&#xff1a;是指在因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合 网页&#xff1a;是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要…

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…

C++笔记之lambda表达式

引言 Lambda表达式是从C 11版本引入的特性&#xff0c;利用它可以很方便的定义匿名函数对象&#xff0c;通常作为回调函数来使用。大家会经常拿它和函数指针&#xff0c;函数符放在一起比较&#xff0c;很多场合下&#xff0c;它们三者都可以替换着用。 语法 [ captures ] (…

javaScript基础面试题 ---宏任务微任务

宏任务微任务一、为什么JS是单线程语言&#xff1f;二、JS是单线程&#xff0c;怎样执行异步代码&#xff1f;1、JS是单线程语言 2、JS代码执行流程&#xff0c;同步执行完&#xff0c;再进行事件循环&#xff08;微任务、宏任务&#xff09; 3、清空所有的微任务&#xff0c;再…

机器学习100天(四十):040 线性支持向量机-公式推导

《机器学习100天》完整目录:目录 机器学习 100 天,今天讲的是:线性支持向量机-公式推导! 首先来看这样一个问题,在二维平面上需要找到一条直线划分正类和负类。 我们找到了 A、B、C 三条直线。这三条直线都能正确分类所有训练样本。但是,哪条直线最好呢?直观上来看,我…

代码随想录算法训练营第六天|242.有效的字母异位词 、349. 两个数组的交集 、 202. 快乐数、1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候&#xff0c;就要考虑哈希法。哈希法是牺牲了空间换取了时间&#xff0c;要使用额外的数组&#xff0c;set或者是map来存放数据&#xff0c;才能实现快速的查找。当我们要使用集合来解决哈希问题的时候&#xff0c;优先使用…