从零学Java 多线程的三个特性

news2024/11/18 12:41:51

多线程的三个特性

多线程要保证并发线程正确执行,必须要保证三个特性。

1 原子性(互斥性):

  • 一个或多个操作不能被分割,要么全部执行,要么就都不执行。

2 可见性:

  • 多个线程访问同一个变量,一个线程修改了这个变量,别的线程能立即看到修改的值。
  • volatile关键字保证内存可见性。

3 有序性:

  • 程序执行的顺序按照代码的先后顺序执行。
  • 在单线程中处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行顺序和编写顺序一致,但最终结果是一致的。但是多线程可能会有问题。
  • volatile保证有序性(禁止指令重排序)。

三个特性的实现

synchronized可保证原子性和可见性。但不能保证有序性。

volatile可保证可见性和有序性。但不能保证原子性。

volatile 关键字配合 synchronized 或 Lock接口 实现了原子性、可见性、有序性。

eg:

volatile: 不稳定, 易挥发的 (解除子线程缓存)

public class TestVolatile {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("输入任意字符结束子线程");
        Scanner input = new Scanner(System.in);
        input.next();
        myThread.flag = true;
        System.out.println("flag: "+myThread.flag);
    }

    static class MyThread extends Thread {
        volatile boolean flag = false;

        @Override
        public void run() {
            System.out.println("子线程开始执行...");
            while (true) {
                if (flag) {
                    break;
                }
            }
            System.out.println("子线程结束了...");
        }
    }
}

内存分析:

在这里插入图片描述

面试题

i++是原子操作吗? 不是原子操作。

(1)读取i的值 (2)执行加1操作(3)修改i的值

使用原子操作类解决。

TestAtomic:

public class TestAtomic {
    public static void main(String[] args) {
        Atomic atomic = new Atomic();
        ExecutorService es = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            es.submit(()-> System.out.println(atomic.getNum()));
        }
        es.shutdown();
    }

    static class Atomic {
//        private int num = 0;
        private final AtomicInteger integer = new AtomicInteger();

        public int getNum() {
            return integer.getAndIncrement();
        }
    }
}

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

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

相关文章

续航50年原子能电池揭秘

我国公司Betavolt最近宣布推出一款面向消费者市场的原子能电池&#xff0c;声称其使用寿命长达50年。首款采用该公司新型原子电池技术的产品名为Betavolt BV100&#xff0c;主要构造材料包括镍-63同位素和金刚石半导体材料。Betavolt表示&#xff0c;其核电池将主要应用于航空航…

【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)

带你一同学习和实践操作Linux服务器必学的Shell指令 前提介绍more和less命令用法more命令命令格式命令参数 常用操作命令案例分析显示文件中从第3行起的内容将日志内容设置为每屏显示4行快速定位和显示文件中包含特定字符串结合管道和more命令来分页显示 less指令命令格式搜索指…

【C++进阶】心心念念的红黑树,它来了!

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

codesys【看门狗】

看门狗&#xff1a; 时间&#xff1a; 看门狗饿死时间。灵敏度&#xff1a;是看门狗时间的倍数。看门狗1秒&#xff0c;灵敏度5&#xff0c;结果就是5秒。Task类型&#xff1a; 循环&#xff1a;用于现场总线。惯性滑行&#xff1a;CPU空闲就运行&#xff0c;主程序用这个。 P…

【模板规范】会议纪要模板

文章目录 1、简介2、纪要模板2.1、表格类会议纪要2.2、文档类会议纪要2.3、简易版项目纪要 3、会议纪要3.1、作用3.2、特点3.2.1、工作会议纪要3.2.2、代表会议纪要3.2.3、座谈会议纪要3.2.4、联席会议纪要3.2.5、办公会议纪要3.2.6、汇报会议纪要3.2.7、技术鉴定会议纪要 3.3、…

HCS私有云简介

1、HCS简介和发展史 华为云产品&#xff1a;私有云和公有云&#xff0c;现在的私有云已经和公有云越来越像了FusionSphere是华为的一个品牌2016年&#xff0c;在5.0版本的时候&#xff0c;华为Openstack叫FusionSphere Openstack 5.0&#xff0c;底层用的是suse操作系统&#…

一天一个设计模式---组合模式

基本概念 组合模式是一种结构型设计模式&#xff0c;它允许客户端统一对待单个对象和对象的组合。组合模式通过将对象组织成树形结构&#xff0c;使得客户端可以一致地使用单个对象和组合对象。 主要角色&#xff1a; Component&#xff08;组件&#xff09;&#xff1a; 定…

Express安装与基础使用

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c; 官方网站&#xff1a; Express - 基于 Node.js 平台的 web 应用开发框架 - Express中文文档 | Express中文网 中文文档&#xff1a; 路由 - Express 中文文档 简单来说&am…

Vulnhub靶机:driftingblues 2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues2&#xff08;10.0.2.18&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…

逸学Docker【java工程师基础】3.3Docker安装nacos

docker pull nacos/nacos-server docker network create nacos_network #创建容器网络 docker run -d \ --name nacos \ --privileged \ --cgroupns host \ --env JVM_XMX256m \ --env MODEstandalone \ --env JVM_XMS256m \ -p 8848:8848/tcp \ -p 9848:9848…

一文教你使用 ChatGPT API function calling

一文教你使用 ChatGPT API function calling Function call如何理解Function call如何调用&#xff1f; Function call 如何理解Function call 函式呼叫(function calling) 可说是这次ChatGPT API 更新的杀手级更新。所谓函式呼叫&#xff0c;就是让你把外部函式的形状写入Cha…

【Java IO分类】从传输方式和数据操作上理解 Java IO分类

Java IO - 分类 IO理解分类 - 从传输方式上字节流字符流字节流和字符流的区别字节转字符Input/OutputStreamReader/Writer IO理解分类 - 从数据操作上文件(file)数组([])管道操作基本数据类型缓冲操作打印对象序列化反序列化转换 IO理解分类 - 从传输方式上 从数据传输方式或者…

CSS3十大滤镜效果详解

滤镜效果 类似于美颜相机、美图秀秀这样的美颜工具&#xff0c;能够让我们轻松地应用多种特效&#xff0c;例如转换为黑白照片、复古风格化、调整亮度等。在之前仅凭CSS几乎很难做到这些效果。 但在CSS3的语法中&#xff0c;所有的这些视觉特效都是通过“filter”属性来快速实…

最全 chrome driver

超全chrome和driver的对应链接 https://raw.githubusercontent.com/GoogleChromeLabs/chrome-for-testing/main/data/latest-patch-versions-per-build-with-downloads.json 从这个链接中直接找对应的chrome和driver 复制链接下载。 注意最新版的在一些文章里的链接是找不到的…

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…

深度学习记录--偏差/方差(bias/variance)

误差问题 拟合神经网络函数过程中会出现两种误差&#xff1a;偏差(bias)和方差(variance) 偏差和误差的区别 欠拟合(underfitting) 当偏差(bias)过大时&#xff0c;如左图&#xff0c;拟合图像存在部分不符合值&#xff0c;称为欠拟合(underfitting) 过拟合(overfitting) …

软件测试|使用Python生成PDF文件

简介 PDF&#xff08;Portable Document Format&#xff09;是一种常用的文档格式&#xff0c;具有跨平台兼容性、保真性、安全性和交互性等特点。我们日常生活工作中的合同、报告、论文等通常都采用PDF格式&#xff0c;以确保文档在不同的操作系统&#xff08;例如 Windows、…

鸿蒙开发工程师会不会有很好的就业前景?

一&#xff0c;鸿蒙带动IT开发和应用整体结构的变革 1月11日&#xff0c;以鸿蒙为首的华为概念股大幅走强&#xff0c;创业板创识科技拉升封板&#xff0c;传智教育、智度股份、高新发展、立达信、吉大正元等多股涨停&#xff0c;华亚电子、九联科技、软通动力、辰奕智能、芯海…

正则化方法介绍

在深度学习中&#xff0c;正则化是一种用于防止模型过拟合的技术。过拟合是指模型在训练数据上表现良好&#xff0c;呆在未见过的测试数据集上表现效果较差的情况。正则化的目标是通过对模型性的参数或层的约束&#xff0c;使其在训练数据上表现的不那么复杂&#xff0c;从而提…

【RTOS】快速体验FreeRTOS所有常用API(10)资源管理

目录 十、资源管理10.1 基本概念10.2 关任务调度器10.3 关中断10.4 实例 十、资源管理 该部分在上份代码基础上修改得来&#xff0c;代码下载链接&#xff1a; https://wwzr.lanzout.com/iqBYJ1lauxof 密码:9adb 该代码尽量做到最简&#xff0c;不添加多余的、不规范的代码。 内…