Java并发编程(二):同步机制与多线程是否矛盾
同步机制与多线程是否矛盾
- 0 纠正对异步和多选误解
- 1 概述
- 2 为什么要引入同步机制
- 3 为什么多线程依然有意义
- 3 总结
大家好,我是欧阳方超,可以关注我的公众号“欧阳方超”,后续内容将在公众号首发。
0 纠正对异步和多选误解
行文之前先纠正一下对异步和多线程的误解,之前准备写Java多线程系列的文章时,起的标题为Java异步编程,现在看来是不确切的,尽管多线程和异步有着一些联系,但它们也有区别。它们的联系是多线程可以用来实现异步操作,例如,Java中可以使用ExecutorService来管理线程池,并通过异步方法提交任务,从而实现非阻塞调用。而区别是,异步是为了提高程序的响应性,使得主线程不被阻塞,而可以继续处理其他任务。多线程是实现并发的一种方式,通过多个线程同时执行任务来提高效率。
1 概述
同步机制会确保某一时刻只有一个线程能访问同步代码块或方法,其他线程一直等待,那这跟只用一个主线程执行任务有什么区别,这个问题困惑我已久,多方查阅资料后似乎解惑了,本文就回答一下这个问题,算是对自己的交代。
2 为什么要引入同步机制
我们都知道,使用多线程时,不同线程可能会访问共享资源,比如修改同一个变量或者读写同一个文件。如果不同线程之间没有同步机制,就会导致数据不一致的问题。这就是为什么需要引入同步机制来保证线程安全。比较基本的一种同步机制是使用synchronized关键字,它可以确保在某一时刻,只有一个线程可以执行某个被同步的代码块或方法,其他要执行这块代码或方法的线程需等待,从而避免了多个线程同时访问共享资源时可能会出现的问题。比如:
public class Counter {private int count = 0;// 使用 synchronized 确保每次只有一个线程能执行这个方法public synchronized void increment() {count++;}public synchronized void decrement() {count--;}public synchronized int getCount() {return count;}
}
如果没有 synchronized,当多个线程同时调用 increment() 或 decrement() 时,可能会发生不可预测的结果,因为两个线程可能同时修改 count,导致数据不一致。
3 为什么多线程依然有意义
但是有一个问题一直让我困惑, 既然引入同步机制后,也只能有一个线程执行同步代码块或方法,那这跟只使用一个线程执行任务有什么区别,多方查资料后,有一天这个问题终于想明白了,如果单单说同步代码块或方法,同一时刻只有一个线程能执行,这跟只用主线程执行这个同步代码块或方法,可能区别不大,但是问题在于程序中不可能处处都是共享资源吧,所以也就不可能处处都设置为同步代码块或方法吧(这也是锁的使用原则,合理设计锁的力度和范围,避免出现“大锁”),既然如此那些没有设置为同步代码块或方法的地方,依然可以使用多个线程来执行,所以多线效率的效率整体上还是高于单个主线程单独执行的效率的。
3 总结
- 多线程的必要性:多线程的主要目的是提高程序的并发性和性能,尤其是在任务之间可以并行执行时,能够显著缩短总的执行时间。
- 同步的作用:同步确保在多线程环境下,访问共享资源时的数据一致性。虽然它会引入一些等待,但它只是保护共享资源的访问,并不意味着多线程就无法提高效率。
- 多线程依然有意义:即使有同步存在,多个线程依然可以并行执行独立的任务,从而提高总体的吞吐量和效率。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。
相关文章:

Java并发编程(二):同步机制与多线程是否矛盾
同步机制与多线程是否矛盾 0 纠正对异步和多选误解1 概述2 为什么要引入同步机制3 为什么多线程依然有意义3 总结 大家好,我是欧阳方超,可以关注我的公众号“欧阳方超”,后续内容将在公众号首发。 0 纠正对异步和多选误解 行文之前先纠正一下…...

golang分布式缓存项目 Day2 单机并发缓存
注:该项目原作者:https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 支持并发读写 接下来我们使用 sync.Mutex 封装 LRU 的几个方法,使之支持并发的读写。在这之…...
一个百度、必应搜索引擎图片获取下载的工具包
前言:前段时间需要一大批图片,跑去百度搜图下载,发现特别麻烦,于是用了一天时间写了一个工具库,方便后续使用,这里分享给大家 imagecapture 是一个用 Go 语言编写的库,旨在从百度和必应等搜索引…...
安全见闻(网络安全篇)
笔记仅供学习,切勿触碰法律红线! 以下笔记学习来自B站泷羽Sec:https://space.bilibili.com/350329294?spm_id_from333.337.search-card.all.click 如涉及侵权马上删除文章 1.编程语言 C语言:一种通用的、面向过程的编程语言&am…...
手写一些方法
模拟new方法 function Otaku(name,age) {this.name name;this.age age; this.habit Games}Otaku.prototype.strength 60;Otaku.prototype.sayName function () {console.log("I am " this.name);};function myNew(fn, ...args) {const obj Object.create(f…...

仅需三步!用AI工具免费打造10w+抖音爆款烟火秀视频教程
抖音上的烟火秀视频总能唤起人们对节日的温馨回忆,它们不仅视觉效果震撼,还自带流量属性。我自己在刷到这类视频时,也不禁回想起童年放烟花的快乐时光,那种浓厚的年味让人怀念。这些视频通常伴随着合适的音乐,能够迅速…...

基于redis实现API接口访问次数限制
一,概述 日常开发中会有一个常见的需求,需要限制接口在单位时间内的访问次数,比如说某个免费的接口限制单个IP一分钟内只能访问5次。该怎么实现呢,通常大家都会想到用redis,确实通过redis可以实现这个功能,…...

[ Linux 命令基础 3 ] Linux 命令详解-文件和目录管理命令
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

npm i 的时候报错: npm ERR! Error: EPERM: operation not permitted, rename
文章目录 噩梦解决办法总结 噩梦 最近改漏洞,这个项目删掉了 node_modules文件夹 重新安装依赖,结果安装一半的时候就一直报这个错。 然后查了很多方法,基本都是下面这些: 权限不够,以管理员运行cmd重新安装。清除 n…...

如何迁移剪映源文件
1、打开剪映,打开全局设置 2、查看草稿位置。把要迁移的文件拷贝到这个路径下面。 3、关闭文件,返回上一层界面,可以看到拷贝到目录下的文件。...
Go语言中的`io.Copy`函数:高效的数据复制解决方案
在Go语言中,io.Copy函数是一个强大而高效的工具,用于将数据从一个io.Reader复制到一个io.Writer。这篇文章将深入探讨io.Copy函数的工作原理、使用方法及其在实际应用中的优势。无论您是后端开发人员还是对Go语言感兴趣的程序员,这篇文章都将…...

datastage在升级版本到11.7之后,部分在11.3上正常执行的SP报错SQLSTATE = 22007: 本机错误代码 = -180
在升级版本到11.7之后,部分在11.3上正常执行的SP开始报错,报的SQL错误是时间参数问题,但是一样的SP可以直接call sp执行,也可以手动调用作业执行,只有设置定时调度时作业会报错, CALLXXX.XXX(1,CURRENT TIM…...

docker——项目部署
什么是Docker? Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几…...
设计模式(Unity)——更新中
设计模式 文章目录 设计模式工厂模式创建方法(Create Methods)简单工厂(Simple Factory)工厂方法(Method Factory)抽象工厂(Abstract Factroy) 策略模式 工厂模式 创建方法…...

小程序中引入下载到本地的iconfont字体图标加载不出来问题解决
我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …...
百度富文本禁止编辑
<script type"text/javascript">$(function () {editorcontent new baidu.editor.ui.Editor();editorcontent.render(authentication);//禁用代码editorcontent.ready(function () {editorcontent.setDisabled();});try {editorcontent.sync();} catch (err) …...

C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信
1. 前言 RabbitMQ是一个流行的开源消息队列系统,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中,我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…...

头歌网络安全(11.12)
头歌禁止复制解决 必须先下篡改猴!!!! 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关:使用Servlet生成验证码 任务描述 本关任务:使用se…...
洛谷 P1725 琪露诺(线段树优化dp)
题目链接 https://www.luogu.com.cn/problem/P1725 思路 我们令 d p [ i ] dp[i] dp[i]表示琪露诺移动到第 i i i个格子时能够获得的最大冰冻指数。 显然,状态转移方程为: d p [ i ] m a x ( d p [ i ] , d p [ k ] a [ i ] ) dp[i] max(dp[i],dp…...
【LeetCode】【算法】19. 删除链表的倒数第N个结点
LeetCode 19. 删除链表的倒数第N个结点 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 思路 思路:快慢指针,快指针先移动n步,快慢指针再同时移动直到快指针到达链表末尾,此…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...