JavaSE3(4/26)

news2025/1/20 18:33:14

目录

1.线程的状态

2.线程安全问题

3.synchronized的具体用法

4.


1.线程的状态

首先明白进程的状态:就绪或者阻塞

上述说的就绪和阻塞其实是针对系统中的线程状态(PCB)

Java中对于Thread类中的线程的状态进行了进一步的细化

NEW: Thread对象有了,但是线程还没有被执行

TERMINATE:线程无了,但是Thread对象还在

Time_Waiting   sleep(1000) 和join(1000) 导致的有限时间的阻塞

Waiting    等待唤醒导致的阻塞

Blocked 加锁导致的阻塞synchronized

2.线程安全问题

什么是线程不安全?

由于操作系统调度线程是随机的(抢占式执行)

所以由于随机性的调度线程可能会出现一些bug,这些我们成为线程不安全

线程安全不安全指的是有没有bug

上述是线程不安全的一个例子。

因为count++执行有三部(3个CPU指令),

1.获取count的值到寄存器

2.在寄存器中的值加1

3.寄存器中的值返回count的值

而如果不加锁,多个线程是抢占式执行的,他们同时可能都抢到了同样的一个值的count,假若说为100,那么他们加1后都是101,count进行了两个不同线程的一次++,本应该+2,却+了1,这就是线程不安全,给increase函数上锁,同时只能一个线程进入这个函数,就会解决这个问题

加锁解决线程安全问题

Object lock =new Object()

synchronized(lock){

//执行的加锁代码

}

加锁的机制,只有一把锁,一个线程加锁了后面的线程再加锁就会阻塞,直到加锁的那个线程执行完毕unlock。

通过阻塞,可以使一个乱序的并发变成一个串行操作,串行和单线程没啥区别了。

并发性越高,速度越快,但同时可能会导致线程不安全的bug

加了锁之后并发程度降低,速度变慢了。但是这是必要的牺牲。

多线程仍然是有非常大的意义的。实际开发中,一个线程会有许多的任务,他们的少部分是加锁的,但是剩下的大部分都是并发的,比串行还是快的多的。

        


加锁的方式

Java中加锁的方式有很多种,最多的就是synchronized关键字

1.直接给方法前面加synchronized

当一个线程加锁了之后,其他线程再加锁,就会处于阻塞状态(Blocked状态)阻塞一直持续到占用锁的线程Unlock

2.new个方法 synchronized(lock){代码体}


什么时候会线程不安全?

并不是所有的线程都要加锁,加锁了之后就和串行执行一样了(多线程的优势就形同虚设了)

线程不安全的原因

1.线程是抢占式随机执行的线程是抢占式执行同一个资源

2.多个线程对同一个变量进行修改操作 ,多个线程对不同变量修改没事,多个线程对同一个变量读也没事

3.针对变量的操作不是原子的~(也就是说虽然只是一个行代码,但是cpu执行分为好几个步骤 如count++)

4.内存可见性:线程一对内存中的数据进行修改的时候,线程2可能感受不到,这就会导致线程不安全。

编译器对程序的优化可能会导致线程误判(线程2感受不到线程1的修改)

解决内存可见性方法:

1.synchronized加锁,被它加锁,编译器不会假设一个变量不会改变。

synchronized既保证了内存可见性,又保证了原子性

2.volatile 关键字

volatile关键字只保证了内存可见性,和原子性无关。

使用volatile 关键字对变量进行修饰,就是禁止编译器进行优化,每次读取数据只从  内从中去读取。

补充:编译器优化(很玄学),如果读的操作,编译器发现每次从内存中读的都是一个数据不变,重复很多很多次,它就会从寄存器中去读取数据(为了更快),但是后面一旦这个内存中的数据被修改,编译器感受不到,就导致了线程不安全。

补充:原子性:要么全部一起执行完毕,要么一个也不执行。count++这个不具备原子性,它的三部可以被不同的线程打乱         

加锁操作就会把多个机器指令打包成一个原子的操作(一起执行的操作)

5.指令重排序,也会影响到线程安全问题,指令重排序也是编译器优化的一种操作

(就是对代码顺序的重新排序,使之更加高效(保证逻辑不变得前提下,再去调整顺序).一般不影响代码的结果,但是在多线程中可能会出问题)

解决方案:synchronized :不仅能保证原子性,还能保证内存可见性,还能保证指令重排序

3.synchronized的具体用法

synchronize 原意是同步,同步在计算机中有许多的意思.

在多线程的线程安全中,同步指的是"互斥"

在IO或者网络编程中,同步叫做"异步",此处的同步和互斥没有任何关系,和线程也没关系了.

使用方式:

1.直接修饰普通的方法

针对当前对象进行加锁

2.修饰一个代码块

3.修饰一个静态的方法

加锁的底层:

4.

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

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

相关文章

RabbitMQ之介绍以及安装

1.1 MQ的相关概念 1.1.1 什么是MQ ​ MQ,从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ…

摄影tips

一、基础知识 相机挡位 A档就是全自动模式或称场景智能自动模式,该拍摄模式下,相机会根据光线和你所拍摄的对象等场景环境自行设置快门、光圈等参数,你不需要调整任何参数,拿起相机对焦按快门就行,也就是AUTO模式。虽…

opengauss编译和使用oracle_fdw

opengauss虽然继承自postgresql9.2,但由于做了魔改,网上通用的从oracle_fdw源码编译安装到postgresql的方法,是否成功的应用到opengauss,并不一定,今天试了一下,参照opengauss官网文档(其实写的…

Spring Bean的作用域及生命周期

目录 前言: Bean的作用域(Scope) 单例模式 原型模式(多例作用域) 请求作用域(request) 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结: 前…

多模态论文串讲:ALBEF VLMo BLIP CoCa Beit V3

文章目录 前言ALBEF:Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(2021-10)VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts(2021-11)relatedmethod BLIP:Bootstrapping Language-Im…

【贴片SD Card介绍】贴片SD Card (LEILONG雷龙科技)

有幸申请到了雷龙科技代理的 贴片 SD Card (SD NAND) 样品,做出测试,分享一下。 型号:CSNP32GCR01-BOW;CSNP4GCR01-BOW 生产方:CS创世半导体 由于是第一次使用贴片类型的 SD Card ,可能文章会有较多疏忽。…

【Git】Windows Git和TortoiseGit安装教程(Git2.23.0、TortoiseGit2.8.0、语言包2.8.0)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

eletron+react+antd+node开发桌面小程序并打包(electron-packager+electron-builder)

首先罗列一下项目中用到的技术: electron, react,antd, typescript, node,及打包命令:pkg,electron-packager,electron-builder及child_process实现多进程 需求:开发一个桌面应用,左…

前端架构师-week3-脚手架执行准备过程实现

目录​​​​​​​​​​​​​​ 脚手架框架代码拆包 import-local应用 检查版本号功能开发(require加载资源类型讲解 npmlog封装) 最低Node版本检查功能开发 root 账号启动检查和自动降级功能开发 用户主目录检查功能开发 入参检查和 debug…

华为OD机试真题(Java),火星文计算(100%通过+复盘思路)

一、题目描述 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y 2*x3*y4 x$y 3*xy2 其中x、y是无符号整数;地球人公式按C语言规则计算;火星人公式中,$的优先级高于#,相同的运算符&#x…

数字船厂信息化整体解决方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除 数字船厂建设思路 智慧船厂将以信息化为基础、以数据为纽带、以制造为核心、以管理为载体打造新型智慧园区,该智慧园区整合了船厂的安全、环保、能源、安防、应急…

基于 JavaWeb 的用户报名审核平台项目

目录 一、项目的需求: 二、项目的思路流程: 三、项目的框架(基于JavaWeb): 四、项目的详细搭建 1、数据库--建库建表 2、JavaBean编写(以Status.java为例) 3、Dao层(StatusDao…

Linux系统与shell编程第一节课

目录 1.1 Linux发展历史 1.2 什么是linux? 1.3 Linux的发行版 Host-Only(仅主机模式) windows开发 linux服务 区块链, 特点:稳定,安全,可移植性,低资源消耗,开源软…

做工业品行业的财务有多难

财务 做工业品行业的财务需要具备一定的财务和会计知识,以及对行业内经济运作有一定的了解。在处理大量数据和信息方面也需要有较高的能力。此外,工业品行业往往涉及到复杂的生产过程和供应链管理,需要对这些方面有一定的了解和掌握。因此&a…

数据结构初阶(栈和队列)

文章目录 一、栈1.1 什么是栈1.2 栈的使用(1)底层代码(2)方法(3)栈的应用 二、队列2.1 什么是队列2.2 队列的使用(1)底层代码的实现(2)队列的使用 2.3 双端队…

字节跳动发放年终奖,远超预期~

最近一段时间,国内互联网大厂接连公布年终奖情况,整个后厂村都洋溢在春节般的喜庆气氛里。 虽然由于各种各样的顾虑(主要是人员流失问题),大部分公司都将年终奖发放时间调整到了年中,但好饭不怕晚&#xf…

06_Callable接口

Thread类、Runnable接口使得多线程编程简单直接。 但Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值。没有返回值这点稍微有点麻烦。不能声明抛出检查型异常则更麻烦一些。 public void run()方法规范意味着你必须捕获并处理检查型异常。即使你小…

磁盘被格式化了能找到资料吗?资料找到的具体方法

磁盘格式化了还能找到,用读卡器接到电脑,就可以作为可移动磁盘来找到资料。下面讲下磁盘被格式化了能找到资料吗?资料找到的具体方法 磁盘被格式化了能找到资料吗?资料找到的具体方法 工具/软件:sayRecy 步骤1&#xf…

博世中国创新软件开发中心 BCSC

Bosch China Innovation and Software Development Campus 博世中国创新软件开发中心 BCSC 擎软件! 拓未来!Bosch China Innovation and Software Development Campus——IntroductionBOSCH——Our AdvantagesBOSCH——Hotly recruited positions Welcom…

wifi芯片行业信息汇总

1、Wifi概述 Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词。 主要版本: 随着最新的 802.11 ax 标准发布,新的 W…