Java并发编程深入浅出(个人造诣)

news2024/11/24 4:08:58

目录

串行,并行与并发:

并发编程的目的

如何保证多线程的安全(并发编程思想)

写后读思想:(一个线程写后再让另一个线程读)

如何保障写后读?

1、加锁:(synchronized)

2、CAS 比较并交换


今天,我们从最基本的角度来谈谈并发编程,本篇文章主要来聊聊并发编程的整体思路,具体的知识和原来我们放在之后的文章。

首先补充一个小概念:

串行,并行与并发:

串行:n个任务 挨个执行

并行:多个任务 同一时刻发生 (多个程序可同时运行 多个任务分配到多个处理器上)

并发:多个任务 同一时间段发生 (每一时刻只能有一个程序执行,但由于CPU高速运转,使多个任务快速切换,程序交替运行)

并发编程的目的

并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题。

所以呢,我们不是一上来就要开多线程的,只有在CPU产生计算浪费且浪费比例较大的情况下,才使用多线程。而多线程开多少个线程合适?这与CPU浪费比例以及上下文开销有关,能让CPU刚好打满合适。

聊完了多线程的使用场景,我们再来聊聊,并发编程的思想:

如何保证多线程的安全(并发编程思想)

写后读思想:(一个线程写后再让另一个线程读)

一个线程读取到其他线程写之后的内容,基于其他线程的计算结果,然后再去操作,才能计算准确

如何保障写后读?

1、加锁:(synchronized)

先加锁再操作(这样一个线程对其加锁了,其他线程就不能再对其读取操作,当(写)操作完之后(数据已经更新回来)再释放锁,此时其他线程竞争式加锁,竞争加锁成功的 再进行读取操作

代码举例:

普通方法加synchronized锁,则线程想调用时必须先对其加锁,此时其他线程不能重复加锁亦不能调用,直到该线程执行完(完成写回操作)此方法释放锁之后,其他线程才能加锁调用(保证写后读思想)

类锁:(静态加锁方法)

类锁解释:当某线程调用一个静态加锁方法后,触发类锁,锁住了整个静态方法区,此时任何一个加锁的静态方法都不可被其他线程调用

如下代码:

假设t1线程调用getA()方法,触发类锁,锁住方法区。然后执行完getA()方法,释放类锁,此时t1线程时间片到期,t2线程开始执行,调用getA()方法,读到a数据,但此时t1线程还没完成写操作。没有做到“写后读”,此过程不安全。

2、CAS 比较并交换

线程每次读写操作时,都会将附加变量+1,这样其他线程读取时会先与这个附加变量对比,如果不一致,则不可读取进行操作,如果一致再进行写操作(也是写后读思想)

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

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

相关文章

Cocos Creator2D游戏开发(3)-飞机大战(1)-背景动起来

资源见: https://pan.baidu.com/s/1cryYNdBOry5A4YEEcLwhDQ?pwdzual 步骤 1, 让背景动起来 2, 玩家飞机显现,能操控,能发射子弹 3.敌机出现 4. 碰撞效果(子弹和敌机,敌机和玩家) 5. 积分和游戏结束 6. 游戏存档,对接微信小游戏,保存历史最高分 7. cocos发布到微信小游戏 资源…

【计算机网络】IP地址和子网掩码(IP地址篇)

个人主页:【😊个人主页】 系列专栏:【❤️计算机网络】 文章目录 前言IP地址网络地址网络地址的定义与组成作用分类网络地址的分配与管理 广播地址(Broadcast Address)定义构成类型作用注意事项 广播地址功能 组播地址…

【初阶数据结构篇】栈的实现(赋源码)

文章目录 栈1 代码位置2 概念与结构1.1概念1.2结构 2 栈的实现2.1 栈的初始化和销毁2.1.1 初始化2.1.2 销毁 2.2 栈顶插入和删除数据2.2.1 栈顶插入数据(压栈)2.2.2 栈顶删除数据(出栈) 2.3 返回栈顶数据2.4 返回栈的有效数据个数…

Jenkins持续部署

开发环境任务的代码只要有更新,Jenkins会自动获取新的代码并运行 1. pycharm和git本地集成 获取到下面的 Git可执行文件路径 2. pycharm和gitee远程仓库集成 先在pycharm中安装gitee插件 在设置中找到gitee,点击添加账户,并将自己的账户添…

(day26)leecode热题——找到字符串中所有字母异位词

描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s "cbaebabacd", p …

【QGroundControl二次开发】六. QGC地面站中视频流配置gstreamer

本文解决qgc源码编译后无法接收视频推流,原因是缺少gstreamer。 下面为windows安装流程,qgc版本为4.4.1稳定版 1. 安装gstreamer 官网链接:https://gstreamer.freedesktop.org/download/#windows 两个都要下载。安装的时候,在cu…

网络安全自学从入门到精通的制胜攻略!!!

在信息时代,网络安全已成为至关重要的领域。越来越多的人希望通过自学掌握这门技术,开启充满挑战与机遇的职业道路。以下是一份精心为您打造的网络安全自学攻略,助您在自学之旅中乘风破浪。 一、明确目标与兴趣方向 网络安全涵盖众多领域&am…

Java的四种引用类型

Java的四种引用类型 1. 强引用(Strong Reference)2. 软引用(Soft Reference)3. 弱引用(Weak Reference)4. 虚引用(Phantom Reference) 💖The Begin💖点点关注…

硬件工程师笔面试真题汇总

目录 1、电阻 1)上拉电阻的作用 2)PTC热敏电阻作为电源电路保险丝的工作原理 2、电容 1)电容的特性 2) 电容的特性曲线 3) 1uf的电容通常来滤除什么频率的信号 3、电感 4、二极管 1)二极管特性 2)二极管伏安…

MySQL练手 --- 1633. 各赛事的用户注册率

题目链接:1633. 各赛事的用户注册率 思路: 两张表,一张为Users用户表,该表存储着所有用户的 user_id 和 user_name 另一张表为Register注册表,该表存储着赛事id(contest_id),和已…

NumpyPandas:Pandas库(25%-50%)

目录 前言 一、列操作 1.修改变量列 2.筛选变量列 3.删除变量列 4.添加变量列 二、数据类型的转换 1.查看数据类型 2.将 ok的int类型转换成float类型 3.将ar的float类型转换成int类型 三、建立索引 1.建立DataFrame时建立索引 2.在读入数据时建立索引 3.指定某列或…

PHP8.3.9安装记录,Phpmyadmin访问提示缺少mysqli

ubuntu 22.0.4 腾讯云主机 下载好依赖 sudo apt update sudo apt install -y build-essential libxml2-dev libssl-dev libcurl4-openssl-dev pkg-config libbz2-dev libreadline-dev libicu-dev libsqlite3-dev libwebp-dev 下载php8.3.9安装包 nullhttps://www.php.net/d…

【Linux】生产者消费者模型 + 线程池的介绍和代码实现

前言 上节我们学习了线程的同步与互斥,学习了互斥锁和条件变量的使用。本章我们将学习编程的一个重要模型,生产者消费者模型,并且运用之前学的线程同步和互斥的相关接口来实现阻塞队列和环形队列,最后再来实现一个简易的线程池。 …

springboot电子产品销售系统-计算机毕业设计源码80294

摘 要 电子商务行业在全球范围内迅速发展,随之而来的是电子产品销售市场的快速增长和消费者对在线购物体验的需求提升,因此,电子产品销售系统应运而生。该系统旨在满足电子产品市场的需求,提供全面的购物功能和高效的管理操作。 …

严格模式 模块化开发

严格模式 当你在脚本或函数的顶部添加"use strict"语句时,你的代码将在严格模式下执行。这可以帮助你避免某些常见的编程陷阱,例如在不声明变量的情况下就使用它们,或者删除变量、函数或函数参数。在严格模式下,这样的…

进阶篇,内附代码:锂电池二阶模型-离线与在线参数辨识

锂电池二阶模型-在线参数辨识 背景二阶等效电路模型介绍二阶模型的离线参数辨识二阶模型的RLS表达式递推代码已知问题背景 锂电池一阶戴维南等效模型的参数辨识方法,已经在前面两期详细地讲解了一轮。 一阶模型-离线参数辨识一阶模型-在线参数辨识本期继续讲解一下如何进行二…

stm32——lcd液晶显示

一.液晶屏介绍 液晶显示屏是由液晶显示面板,电容触摸屏,pcb底板构成。在液晶显示屏里我们有带控制芯片的还有不带控制芯片的。对于低端的微控制器它不能直接控制液晶面板,所以需要给液晶控制面板而外增加一个液晶控制芯片。对于单片机stm32f4…

Photos框架 - 自定义媒体选择器(UI预览)

引言 在前面的博客中我们已经介绍了使用媒体资源数据的获取,以及自定义的媒体资源选择列表页。在一个功能完整的媒体选择器中,预览自然是必不可少的,本篇博客我们就来实现一个资源的预览功能,并且实现列表和预览的数据联动效果。…

内网横向——远程桌面利用

文章目录 一、远程桌面的确定和开启二、RDP Hijacking 网络拓扑: 攻击机kali IP:192.168.111.0 跳板机win7 IP:192.168.111.128,192.168.52.143 靶机win server 2008 IP:192.168.52.138 一、远程桌面的确定和开启 下面…

VMware、Docker - 让虚拟机走主机代理,解决镜像封禁问题

文章目录 虚拟机全局代理配置找到 VMnet8 的 IPv4 地址代理相关配置虚拟机代理配置 Docker 代理配置修改镜像修改 Docker 代理配置 虚拟机全局代理配置 找到 VMnet8 的 IPv4 地址 a)打开此电脑,输入 “控制面板”,然后回车. b)之…