当前位置: 首页 > news >正文

Java多线程(六)

目录

一、什么是线程安全问题

二、产生线程安全问题的原因

三、解决线程安全问题的方法

3.1 join()等待

3.2 synchronized加锁

3.3 wait()和notify()

3.4 volatile关键字


一、什么是线程安全问题

在操作系统中,线程的调度是随机的(抢占式执行),由于这种随机性就会导致线程在执行的过程中由于执行顺序问题引发bug,这个bug就是线程的安全问题。所以也说:线程安全问题本质上就是由于线程的执行顺序不确定产生的。

二、产生线程安全问题的原因

产生线程安全的原因有以下几个方面:

  • 线程是抢占式执行的
  • 多个线程同时修改同一个变量
  • 修改操作不是原子的
  • 内存可见性问题
  • 指令重排序

三、解决线程安全问题的方法

3.1 join()等待

join()等待方法可以在很大程度上解决线程的安全问题,因为join()等待方法是将多线程串行化执行了,必须等待某一线程执行完才能将另一个线程执行完。由于join()方法是将整体的线程串行化了,可能会降低执行的效率。

3.2 synchronized加锁

采取synchronized加锁可以保证线程的执行顺序,但是这个前提是多个线程要使用同一个锁对象,如果不是同一个锁对象加锁就是没有意义的。当使用同一对象加锁之后,如果一个线程正在执行任务,另一个线程想要执行就必须阻塞等待,只有等前一个线程执行完释放锁,另一个线程才能去执行。

由于synchronized加锁并不是将整个多线程加锁,它可以只对小部分加锁,所以不会很大程度的影响执行效率。

3.3 wait()和notify()

多线程的执行是随机的,但是某些特定的情况下也需要按照一定的顺序去执行代码,这里引入wait()和notify()来调整执行的顺序。

wait()是让程序阻塞等待,这里的前提是wait()需要拿到锁,没有锁自然不能进行阻塞等待,所以wait()的使用条件也需要在synchronized加锁的条件下才能使用。

notify()是唤醒在wait()的线程,notify()没有强制要求必须在synchronized的条件下,但是一般还是选择在synchronized的条件下使用。

wait()与notify()都必须在拿锁对象去使用。

3.4 volatile关键字

由于编译器在某些情况下会对代码进行优化,这里就会产生内存可见性的问题和指令重排序的问题,从而使得多线程产生安全问题。使用volatile关键字可以解决内存可见性问题和指令重排序的问题。

相关文章:

Java多线程(六)

目录 一、什么是线程安全问题 二、产生线程安全问题的原因 三、解决线程安全问题的方法 3.1 join()等待 3.2 synchronized加锁 3.3 wait()和notify() 3.4 volatile关键字 一、什么是线程安全问题 在操作系统中,线程的调度是随机的(抢占式执行&#xff0…...

ceil(),floor(),round()函数C++详解

ceil&#xff08;&#xff09; ceil()函数是这样的&#xff1a; double ceil(double x) ceil函数可以把x上取整。 例子&#xff1a; #include <bits/stdc.h> using namespace std; int main() {double a, b;cin >> a >> b;printf("ceil(%.2f) %.2…...

自动化处理,web自动化测试处理多窗口+切换iframe框架页总结(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 web 自动化之处理…...

企业服务器数据库中了devos勒索病毒怎么办如何解决预防勒索病毒攻击

随着科学技术的不断发展&#xff0c;计算机可以帮助我们完成很多重要的工作&#xff0c;但是随之而来的网络威胁也不断提升。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器数据库遭到了devos勒索病毒攻击&#xff0c;导致系统内部的许多重要数据被加密无法正…...

three.js学习

三大组建&#xff1a;场景(scene),相机(camera),渲染器(renderer) 创建三要素代码&#xff1a; var scene new THREE.Scene(); // 场景 var camera new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); // 透明相机 var renderer new THR…...

Vue3 第一节 Vue3简介以及创建Vue3工程

1.Vue3简介以及Vue3带来了什么 2.创建Vue3.0工程并分析Vue3工程结构 3.setup函数 4.ref函数 5.reactive函数 一.Vue3简介以及Vue3带来了什么 ① Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff0…...

用docker 部署springboot项目

# 加入java FROM bitnami/java # WORKDIR /usr/local/test/boot-work#镜像内的工作目录 WORKDIR /usr/local/test# ENV workPath /usr/local/test/boot-work# 宿主的当前目录 boot-v1.jarjar 拷贝到 WORKDIR下boot.jar ADD boot-v1.jar boot.jar # 暴露80端口 EXPOSE 80 # 启动…...

maven 模块打包时包含依赖和打包可执行的jar

maven 模块打包 1&#xff09;maven 模块打包jar文件时&#xff0c;指定包含依赖&#xff08;with-dependencies&#xff09;&#xff1b; 2&#xff09;maven 模块打包jar文件时&#xff0c;指定入口MainClass、打包生成可执行的jar&#xff1b; vi qftools/common/src/main…...

perl脚本调用openssh不能正确执行(ctl_dir /root/.libnet-openssh-perl/ is not secure)的原因排查

在使用perl脚本的时候&#xff0c;通过Net::OpenSSH去获取执行节点的信息是一种常用的方法。在某个环境中&#xff0c;执行命令的时候出错&#xff0c;下面展示一下相关的代码 my $ssh_ops {user > "root", password > "password", master_opts >…...

Apache+Tomcat 整合

目录 方式一&#xff1a;JK 1、下载安装包 2、添加依赖 3、启动服务&#xff0c;检查端口是否监听 4、提供apxs命令 5、检查是否确实依赖 6、编译安装 7、重要配置文件 方式二&#xff1a;http_proxy 方式三&#xff1a;ajp_proxy 方式一&#xff1a;JK 1、下载安装…...

CSS中page-break-after属性

在CSS中&#xff0c;page-break-after是一个属性&#xff0c;它控制了元素后的分页行为。 当你打印一个网页的时候&#xff0c;page-break-after属性可以设置在元素后插入一个分页符&#xff0c;将内容分割到新的一页上。它的值可以是以下之一&#xff1a; auto&#xff1a; …...

mvn build jar依赖和源码本身分开。减轻编译后的jar大小

问题场景&#xff1a;平时在springboot项目中&#xff0c;打jar包都是默认把开发的代码和依赖jar包都打到一个jar包里&#xff0c;导致每次打包费时而且jar包还很大&#xff0c;升级一下都要把一个很大的包拷来拷去。如果是修改问题需要频繁替换jar包&#xff0c;那简直要疯 解…...

Java是值传递还是引用传递?

值传递和引用传递最大的区别是传递的过程中有没有复制出一个副本来&#xff0c;如果是传递副本&#xff0c;那就是值传递&#xff0c;否则就是引用传递。 Java对象的传递&#xff0c;是通过复制的方式把引用关系传递了&#xff0c;因为有复制的过程&#xff0c;所以是值传递&a…...

16 - 初探Linux进程调度

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 初探Linux进程调度1.1 Linux系统调度1.2 进程调度原理1.3 Linux系统调度策略1.4 进程调度实验设计1.4.1 实验目标1.4.2 实验设计 1.5 实…...

Huggingface使用

文章目录 前置安装Huggingface介绍NLP模块分类transformer流程模块使用详细讲解tokennizermodeldatasetsTrainer Huggingface使用网页直接体验API调用本地调用(pipline)本地调用&#xff08;非pipline&#xff09; 前置安装 anaconda安装 使用conda创建一个新环境并安装pytorc…...

Android 刷新与显示

目录 屏幕显示原理&#xff1a; 显示刷新的过程 VSYNC机制具体实现 小结&#xff1a; 屏幕显示原理&#xff1a; 过程描述&#xff1a; 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制&#xff0c;绘制完成就提交buffer&#xff0c;系统服务把buffer数据…...

三行命令在CentOS 8上安装FFmpeg

添加RPMfusion仓库 yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm 安装SDL yum install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.14-2.el7.x86_64.rpm 安装FFmpeg yum install ffmpeg 执行命令测试 [rootVM…...

【前端】html

HTML标签&#xff08;上&#xff09; 目标&#xff1a; -能够说出标签的书写注意规范 -能够写出HTML骨架标签 -能够写出超链接标签 -能够写出图片标签并说出alt和title的区别 -能够说出相对路径的三种形式 目录&#xff1a; HTML语法规范HTML基本结构标签开发工具HTML常用标…...

【RealTek sdk-3.4.14b】Realtek WiFi开发调试指令总结

格式说明 RTL8192cd 驱动程序提供 MIB 接口&#xff0c;可通过“iwpriv”命令获取/设置参数。 set_mib iwpriv set_mib namevalue1[,value2,value3…]” Iface: “wlan0” value: 1.值可以是单个字段&#xff0c;也可以是用“&#xff0c;”分隔的多个字段&#xff0c;字…...

基于Vue 的文本类弹框代码Demo

<template><div class"text-popup" v-if"showPopup"><h2>{{ title }}</h2><p>{{ content }}</p><button click"closePopup">关闭</button></div><div class"main-content"&…...

从Scratch图形化到Python代码:用树莓派给LeArm机械臂做二次开发实战

从Scratch图形化到Python代码&#xff1a;用树莓派给LeArm机械臂做二次开发实战 当Scratch积木块拼接的机械臂动作开始显得单调时&#xff0c;便是时候揭开底层控制的神秘面纱了。本文将带您跨越图形化编程的舒适区&#xff0c;用树莓派的Python环境重新定义LeArm机械臂的智能—…...

探索Windows HEIC缩略图:跨平台照片管理深度解析

探索Windows HEIC缩略图&#xff1a;跨平台照片管理深度解析 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails Windows HEIC缩略图…...

FPGA高速ADC数据采集实战——基于AD9253 LVDS接口与ISERDESE2设计

1. AD9253高速ADC核心特性解析 AD9253这颗14位125MSPS四通道ADC芯片&#xff0c;在通信和医疗成像领域堪称经典。我经手过的多个雷达项目中&#xff0c;它的信噪比表现总能带来惊喜——75.3dBFS的实测数据比手册标称值还要稳定。但真正让工程师们又爱又恨的&#xff0c;是它那个…...

AutoCut终极指南:如何用文本编辑器快速剪辑100个视频

AutoCut终极指南&#xff1a;如何用文本编辑器快速剪辑100个视频 【免费下载链接】autocut 用文本编辑器剪视频 项目地址: https://gitcode.com/GitHub_Trending/au/autocut 还在为手动剪辑视频而烦恼吗&#xff1f;AutoCut项目让你告别复杂的视频编辑软件&#xff0c;通…...

C语言结构体、枚举、联合体:从内存布局看区别,新手避坑指南

C语言结构体、枚举、联合体&#xff1a;从内存布局看区别&#xff0c;新手避坑指南 在C语言开发中&#xff0c;结构体、枚举和联合体是构建复杂数据模型的三大基石。但很多开发者在实际项目中常遇到这样的困惑&#xff1a;为什么结构体占用的内存比预期大&#xff1f;枚举变量在…...

开源技能库构建指南:Git+Markdown+Docsify打造个人技术知识体系

1. 项目概述&#xff1a;一个开源技能库的诞生与价值在技术领域&#xff0c;尤其是软件开发、运维和数据分析等方向&#xff0c;我们每天都在与海量的工具、框架和命令打交道。时间一长&#xff0c;一个很现实的问题就摆在了面前&#xff1a;那些曾经花了好几个小时才调通的复杂…...

激光切割外壳设计全流程:从创客工具到产品级制造的实战指南

1. 项目概述&#xff1a;为什么选择激光切割来做外壳&#xff1f;如果你和我一样&#xff0c;捣鼓过不少电子项目&#xff0c;从简单的Arduino温湿度计到复杂的树莓派家庭服务器&#xff0c;那你一定为“给它们找个家”这件事头疼过。3D打印太慢&#xff0c;开模注塑成本又高得…...

Go语言构建开发者命令行工具箱:navis项目架构与实现解析

1. 项目概述&#xff1a;一个为开发者打造的“导航”工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫navis&#xff0c;作者是NaveenBuidl。光看名字&#xff0c;你可能会联想到“导航”或者“航行”&#xff0c;没错&#xff0c;这个项目的核心定位就是一个为开发者…...

Agent 一接分布式缓存就开始数据不一致:从 Cache Coherence 到 Write-Through Guard 的工程实战

一、缓存不一致的生产陷阱 在生产环境中部署 Agent 系统时&#xff0c;一个常见的诡异现象是&#xff1a;Agent 从 Redis 缓存读取的业务状态与数据库实际值不一致&#xff0c;导致后续决策出现偏差。这个问题在缓存 TTL 到期前难以察觉&#xff0c;高并发下却反复出现。⚠️ 某…...

3D打印LED发光史莱姆:零焊接电子制作与创意材料科学实践

1. 项目概述&#xff1a;当电子制作遇上创意手工几年前&#xff0c;我在一个社区创客空间带孩子们做活动&#xff0c;发现一个挺有意思的现象&#xff1a;一讲到电路、LED、电阻&#xff0c;不少孩子眼神就开始飘忽&#xff1b;但一旦拿出会发光的、可以随意揉捏的“史莱姆”泥…...