前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析

【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析

作者头像
摘星.
发布于 2025-05-20 06:22:17
发布于 2025-05-20 06:22:17
420
举报
文章被收录于专栏:博客专享博客专享

3. 并发共享

3.1. 并发问题

多个线程同时对共享资源进行修改时,有可能会发生读写操作的指令交错,导致结果跟预期不一样

3.1.1. 临界区

临界区(critical region):一段对共享资源的多线程并发读写操作的代码块

3.1.2. 竞态条件

竞态条件(Race Condition):多个线程代码在临界区执行,由于执行顺序不同而导致结果无法预测,例如数据丢失不一致等

解决方法:使用锁,同步工具,原子类等机制

3.1.3. 死锁

死锁的概念:多个线程由于资源竞争或通信问题导致的阻塞情况。例如:线程1持有线程2所需的资源,且线程1不释放,那么线程2就永远阻塞。

死锁的预防:

  1. 破坏互斥条件,允许资源共享
  2. 请求不到资源时,释放自己持有的资源
  3. 按序获取资源,避免循环等待

死锁的解决:

  1. 杀死持有资源的进程
  2. 操作系统强制释放资源
  3. 回滚进程
3.1.4. 活锁

活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。

活锁的解决:

  1. 引入随机性,在检测到活锁时,暂停随机时间再重新尝试
  2. 设置重试次数,到达一定次数强制退出
  3. 活锁发生时主动干预,打破活锁
3.1.5. 饥饿

饥饿(Starvation):某个线程长期无法获取CPU时间片执行权而无法运行的情况,一般发生在字段调用不公平或优先级设置有问题的情况下

3.1.6. 内存一致性

内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决

3.2. 线程共享问题解决

有多种方法可以避免临界区中的竞态条件:

  • 阻塞式-悲观锁:synchronized,Lock
  • 非阻塞式-乐观锁:原子变量

3.3. 变量的线程安全分析

3.3.1. 成员变量和静态变量

成员变量和静态变量的线程安全分析要分两种情况:

  • 不被共享时是线程安全的
  • 被多个线程共享时,分为两种情况
    • 读操作:是线程安全的
    • 写操作:是线程不安全的
3.3.2. 局部变量

局部变量是否线程安全在于它是否逃逸出方法的作用范围

  • 如果局部变量作用范围仅仅在当前方法,是线程安全的
  • 如果局部变量作为参数传入或作为返回值返回,说明局部变量没有逃逸出方法的作用范围,是线程不安全的
  • 局部变量仅有一个线程访问的时候是线程安全的
  • private和final关键字是可以提供线程安全的,因为可以防止子类重写父类方法,其中可以开启另外一个线程访问局部变量造成线程不安全

3.4. 常见线程安全类

不可变类:内部属性是不可改变的,只能读不能写,所以是线程安全的

  • String:
    • String用final关键字修饰是为了防止子类去重写String方法导致线程不安全
    • 其中的replace,substring改变了值,本质上是通过创建一个新的String对象来完成的,线程安全
  • Integer

方法加上了synchronized方法的类:

  • StringBuffer
  • Random
  • Vector
  • Hashtable
  • java.util.concurrent包下的类,也称JUC

这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
CentOS 安装 GCC【在线 + 离线】
在线安装很简单一个命令搞定 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
Demo_Null
2020/12/09
2.7K0
CentOS  安装 GCC【在线 + 离线】
screen离线安装
此时会报一个错误 configure: error: !!! no tgetent - no screen
华创信息技术
2022/05/28
1.9K0
搭建 LNMP 环境
LNMP是建立web应用的平台,是Linux、NGINX,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的简称。
剧终
2020/08/27
1.2K0
搭建 LNMP 环境
【解决方案】Vue项目部署指南:Nginx部署前端Vue.js项目
首先查找Nginx安装的路径,查看是否安装过nginx: 输入:whereis nginx 如果显示地址,说明已经安装过nginx了。可以跳到2.2步。
中杯可乐多加冰
2024/09/12
3.1K0
CentOS 7 安装Mono 和 MonoDevelop
【原文来自:http://www.linuxidc.com/Linux/2015-01/112350.htm】 好几年前安装过mono,后来一直没有再用过。最近购买了新服务器,想再安装一个试试,先安装
用户1177503
2018/02/26
2.4K0
Linux编译安装Python3.9——以CentOS7为例
在CentOS中使用yum安装python3时,总是安装不到需要的版本,在一些特定的环境下又需要特定版本的Python。然而网上的各种教程又良莠不齐(在此特别diss某某DN),故本篇将详细整理一遍在CentOS7上编译安装Python3的过程。
MoyiTech
2023/02/27
1.7K0
Linux编译安装Python3.9——以CentOS7为例
nginx 手动离线安装 及依赖包安装(pcre+zlib+openssl)
本文介绍了使用源码编译安装 Nginx 的详细步骤及编译参数信息。首先,提到了必需的依赖包,包括 PCRE、Zlib 和 OpenSSL,并提供了它们的下载链接。随后,详细说明了编译环境的准备工作,包括检查和安装 gcc、g++、以及 make。接着,逐步介绍了如何安装各个依赖包以及 Nginx 的过程,包括解压、配置、编译和安装。最后,给出了启动 Nginx 的命令,并提示如何验证安装是否成功。
默 语
2024/11/20
1.7K0
nginx 手动离线安装 及依赖包安装(pcre+zlib+openssl)
Centos7安装Python3并安装Requests的方法
由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。
Erwin
2020/03/02
6K0
Centos7安装Python3并安装Requests的方法
【Nginx】在线安装与离线安装
第三步 ./configure完成后,回到pcre目录下执行make,最后执行make install
陶然同学
2024/01/05
1.7K0
【Nginx】在线安装与离线安装
Linux下配置安装PHP环境
一、安装Apache2.2.22 1、到官网下载  http://httpd.apache.org/download.cgi     2、解压     tar  -zxvf httpd-2.2.22.tar.gz 3、建立目标文件夹(注意以下所有操作都时在root用户下执行的)     mkdir /usr/local/apache2     也就是说等下安装的apache2要安装到这个文件夹里面 4、配置     回到原来解压之后产生的文件夹     ./configure --prefix=/usr/local/apache2 --enable-module=shared     要加上后面的参数,否则无法使用php,-enable-module=shared表示Apache可以动态的加载模块
用户1685462
2021/07/16
15.9K0
Linux安装Nginx 在线&离线
【yum 安装最新版nginx:https://www.cnblogs.com/xxoome/p/7256214.html】 在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。 Linux下检查是否安装过某软件包:http://www.cnblogs.com/xxoome/p/5866553.html 安装命令:
JokerDJ
2023/11/27
1.9K0
Linux安装Nginx 在线&离线
CentOS 7 安装Mono 和 MonoDevelop
MonoDevelop 是个Linux平台上的开放源代码集成开发环境,主要用来开发Mono与.NET Framework软件。MonoDevelop 整合了很多Eclipse与Microsoft Visual Studio的特性,像是 Intellisense、版本控制还有 GUI 与 Web 设计工具。另外还整合了GTK# GUI设计工具(叫做Stetic)。目前支援的语言有C#、Java、BOO、Nemerle、Visual Basic .NET、CIL、C与C++ 。
星哥玩云
2022/07/04
8980
centos7安装python 3.7_python安装后如何使用
RHEL以及他的衍生发行版如CentOS、Scientific Linux为了稳定,官方的rpm repository提供的rpm包往往是很滞后的,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安全稳定是重点,官方的rpm repository提供的rpm包也不够丰富,很多时候需要自己编译那太辛苦了,而EPEL恰恰可以解决这两方面的问题。
全栈程序员站长
2022/11/08
6860
Centos7下nginx的安装与配置
说明:软件安装的基础目录路径:/usr/local 所以下载软件的时候切换到此目录下下载直接解压即可
sunny1009
2019/09/04
1.7K0
Centos7下nginx的安装与配置
单机部署 LNMP
``关闭SELinux # 临时关闭selinux setenforce 0 # 永久关闭selinux sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 关闭防火墙 # 临时关闭防火墙: systemctl stop firewalld # 永久关闭防火墙: systemctl disable firewalld 1. 源码部署nginx 1.1 下载源码 # -c 是断点续传 wget -c http://
萌海无涯
2021/03/16
9100
Linux编译安装Python3.9——以CentOS7为例
在CentOS中使用yum安装python3时,总是安装不到需要的版本,在一些特定的环境下又需要特定版本的Python。然而网上的各种教程又良莠不齐(在此特别diss某某DN),故本篇将详细整理一遍在CentOS7上编译安装Python3的过程。
MoyiTech
2023/01/18
2.7K0
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
服务器为linux的centos系统具体7还是8我不太清楚,全程为没有网络环境,所以环境全部需要离线安装.这里不我建议使用Anaconda虚拟环境进行安装,因为是离线环境.最好是能够准备一台有网络的centos虚拟机进行安装包的下载,方便环境一致这样项目部署后环境一般不会出现问题.
全干程序员demo
2024/04/13
1.7K0
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
Centos7 安装Python3.6.
1、在安装Python之前,需要先安装一些后面遇到的依赖问题(如果有依赖问题,按照提示安装):
py3study
2020/01/08
9530
CentOS7 安装 Python 3.9.0[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
4.3K0
Python离线项目迁移部署
最近遇到了一个场景:需要将Python项目文件打包到无法联网的主机上部署执行,本篇文章记录针对于该场景的处理方案。
oYabea
2020/09/07
1.5K0
推荐阅读
相关推荐
CentOS 安装 GCC【在线 + 离线】
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 3. 并发共享
    • 3.1. 并发问题
      • 3.1.1. 临界区
      • 3.1.2. 竞态条件
      • 3.1.3. 死锁
      • 3.1.4. 活锁
      • 3.1.5. 饥饿
      • 3.1.6. 内存一致性
    • 3.2. 线程共享问题解决
    • 3.3. 变量的线程安全分析
      • 3.3.1. 成员变量和静态变量
      • 3.3.2. 局部变量
    • 3.4. 常见线程安全类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档