JUC并发编程-第二天:线程高级部分

线程高级部分

    • 线程不安全
    • 原子性
    • 可见性
    • 有序性(指令重排)

线程不安全

多线程下并发同时对共享数据进行读写,会造成数据混乱=线程不安全

当多线程下并发访问临界资源时,如果破坏其原子性、可见性、有序性,可能会造成数据不一致。

原子性

原子性操作指相应的操作是 单一不可分割的操作。

可见性

指当多个线程访问同一个资源时,一个线程修改了资源,其他线程能够立即看到修改的值

  • 比如下面的代码就违反了可见性
public class ThreadPool {static boolean alwasy=true;public static void main(String[] args) throws ExecutionException, InterruptedException {new Thread(()->{while (alwasy){}}).start();Thread.sleep(2000);alwasy=false;}
}

原因:两个线程共享主内存变量,复制了两份副本,我们改变的只是主线程的变量 另外一个线程的没有改过来。主内存改了后并不会同步到主内存中。
在这里插入图片描述

  • 解决方法:使用synchronized ,synchronized 在解锁之前会将变量同步到主内存中
public class ThreadPool {static Boolean alwasy=true;public static void main(String[] args) throws ExecutionException, InterruptedException {new Thread(()->{while (alwasy){synchronized (alwasy){}}}).start();Thread.sleep(2000);alwasy=false;}
}

对一个变量解锁之前,必须先把此变量同步回主内存中,这样解锁后,线程就可以访问被修改后的值
所以synchronized 锁住的对象,其值具有可见性

  • 非常重要
    使用 System.out.println();也可以的,因为System.out.println();里面也实现了synchronized 锁
    在这里插入图片描述
    synchronized的锁,任意一个被锁住的对象,只要锁释放了,就会把工作内存中变量同步到主内存
public class ThreadPool {static Boolean alwasy=true;public static void main(String[] args) throws ExecutionException, InterruptedException {new Thread(()->{while (alwasy){//这个也可以System.out.println();}}).start();Thread.sleep(2000);alwasy=false;}
}

有序性(指令重排)

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

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

相关文章

JavaEE多线程(2)

文章目录 1..多线程的安全1.1出现多线程不安全的原因1.2解决多线程不安全的⽅法1.3三种典型死锁场景1.4如何避免死锁问题2.线程等待通知机制2.1等待通知的作用2.2等待通知的方法——wait2.3唤醒wait的方法——notify 1…多线程的安全 1.1出现多线程不安全的原因 线程在系统中…

前端练习小项目——视觉冲击卡片

前言: 前言:在学习完HTML和CSS之后,我们就可以开始做一些小项目了,本篇文章所讲的小项目为——视觉冲击卡片 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下效果&a…

maxKb+ollama+lama2-chinese 基于知识库+本地模型的知识问答系统

maxKbollamalama2-chinese 基于知识库本地模型的知识问答系统 搭建步骤 搭建maxKb docker run -d --namemaxkb -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data cr2.fit2cloud.com/1panel/maxkb# 用户名: admin # 密码: MaxKB123..github的访问地址:https://…

Vant2组件库的基础应用

目录 一、Picker 选择器 1.1、数组对象处理 1.2、每个选项颜色设置 二、滚动分页加载列表 三、Calendar 日历(可选范围限制) 四、input值过滤 官网:Vant 2 - Mobile UI Components built on Vue 一、Picker 选择器 官网示例数据: columns: [杭州…

计算机网络实验之单交换机互联终端实验

1.网线 4对,8根,RJ-45连接器(水晶头); (1)直通线 双绞线缆两端按照EIA/TIA568B规格连接水晶头,该双绞线为直通线。 橘白1,橘2,绿白3,蓝4&#…

WPF学习(2)--类与类的继承2-在窗口的实现

一、代码分析 1.Animal.cs 1.1 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace AnimalNamespace {public class Animal{public string Name { get; set; }public int Age { get; set…

RabbitMQ的简单使用 —— Python篇

(一)RabbitMQ的简介 RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完…

JavaWeb项目配置教程

将你的项目(只有代码的文件,不是整个文件)拖入idea 找到数据库配置代码(一般在Util包里面,或者是properties配置文件)并将密码修改为你的数据库密码。 点击Edit Configurations 点击Configure&#xff0…

SOLIDWORKS安装运行环境建议 慧德敏学

SOLIDWORKS是一款要求很高的软件。无可否认。您的电脑功能越强大,运行得越好,但是我们也要考虑购买成本,因此,选择正确的配置很重要。在选择用于SOLIDWORKS的电脑配置时,需要综合考虑多个方面以确保软件能够流畅、以更…

leetcode动态规划 斐波那契数列

题意: 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中…

【android】用 ExpandableListView 来实现 TreeView树形菜单视图

使用 ExpandableListView 来实现 TreeView 创建一个 ExpandableListAdapter 来为其提供数据。以下演示了如何使用 ExpandableListView 来展示树形结构的数据&#xff1a; 首先&#xff0c;在布局文件中添加 ExpandableListView&#xff1a; <ExpandableListViewandroid:i…

短剧app广告变现系统开发 源码搭建

短剧app广告变现系统的开发以及源码搭建是一个涉及多个技术领域的复杂过程。以下是一个大致的开发和搭建流程&#xff1a; 确定业务需求和目标&#xff1a; 明确短剧app的功能需求&#xff0c;例如短剧展示与播放、分享裂变与付费、投放与分销、内容与数据管理等功能1。确定广告…

Hi3861 OpenHarmony嵌入式应用入门--PWM 三色灯

这篇文章是讲解的pwm控制三色灯的部分&#xff0c;这部分也是后续全彩智能灯的基础。 硬件原理如下 IO管脚定义在hi-12f_v1.1.2-规格书-20211202.pdf文档中 GPIO API API名称 说明 unsigned int IoTGpioInit(unsigned int id); GPIO模块初始化 hi_u32 hi_io_set_func(hi_i…

无引擎游戏开发(2):最简游戏框架 | EasyX制作井字棋小游戏I

一、EasyX中的坐标系 不同于数理中的坐标系&#xff0c;EasyX中的y轴是竖直向下的 二、渲染缓冲区 之前的程序添加了这三个函数改善了绘图时闪烁的情况: 小球在"画布“上移动的过程就是我们在调用绘图函数&#xff0c;这个”画布“就是渲染缓冲区&#xff0c;先绘制的内…

AI在创造音乐

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在音乐领域的应用也日益广泛&#xff0c;从音乐生成到声音合成&#xff0c;AI正逐渐成为音乐创作者的有力助手。然而&#xff0c;这一技术的兴起也引发了关于AI是否会毁掉音乐的讨论。以下从几个方面对这一…

【配置】Notion自动化备份到github方案

步骤 打开notion网页&#xff0c;获取到需要的值 token_v2 找到请求getSpaces的 Cookie 值 token_v2 space_id 找到请求getSpaces的响应结果space,如下图&#xff1a; file_token 找个页面点击导出&#xff0c;之后拿到这个配置项 注意&#xff1a;配置项会过期&#xff0c…

基于一种改进熵方法的旋转机械故障诊断模型(MATLAB)

熵的概念起源于热力学&#xff0c;1884年&#xff0c;玻尔兹曼定义熵&#xff0c;用以描述分子热运动的无序性和混乱度。1948年&#xff0c;Shannon在其发表的《AMathematicalTheoryofCommunication》中提出香农熵&#xff0c;首次将“熵”引入信息度量范畴&#xff0c;为信息论…

RK3568技术笔记十三 Ubuntu的编译

Ubuntu文件系统编译 在编译前需要按照前面的方法初始化编译环境&#xff0c;否则会导致编译失败&#xff08;若配置过则无需重复配置&#xff09;。 按下述方法编译的Ubuntu系统&#xff0c;用户名是&#xff1a;dianyu 密码&#xff1a;1 编译Ubuntu&#xff0c;执…

机械臂 CoppeliaSim Simulink联合仿真

实现机械臂在CoppeliaSim&#xff08;以前称为V-REP&#xff09;和Simulink上的联合仿真涉及多个步骤&#xff0c;包括环境设置、模型导入、通信配置、控制算法设计和测试调试。 前期准备 安装软件配置工作环境创建和配置CoppeliaSim场景 导入机械臂模型配置机械臂参数在Simuli…

javafx打包成exe可执行程序

写文章有点累 我做了个视频录制操作流程 把idea的项目迁移到eclipse, 在eclipse中新建项目, 修改pom文件,拷贝对应java文件, 新建一个java类 里面加载自己的javafx启动application修改项目的jdk版本, 拷贝xml 资源文件, 运行程序如果能运行则迁移成功 接下来导出jar包, 拷贝jd…