【操作系统】解析线程安全中的 Synchronized 关键字

news2024/9/20 15:06:52

目录

  • synchronized
    • 一、互斥性
    • 二、可重入性
    • 三、synchronized的使用

synchronized

synchronized作为确保多线程安全的重要关键字
接下来我们来学习它的特性:

  1. 互斥性
  2. 可重入性

一、互斥性

synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他线程如果也执行
到同⼀个对象synchronized就会阻塞等待.

  • 进入synchronized修饰的代码块,相当于加锁

  • 退出synchronized修饰的代码块,相当于解锁
    在这里插入图片描述
    synchronized⽤的锁是存在Java对象头⾥的。
    在这里插入图片描述

理解"阻塞等待".
针对每⼀把锁,操作系统内部都维护了⼀个等待队列.当这个锁被某个线程占有的时候,其他线程尝试
进行加锁,就加不上了,就会阻塞等待,⼀直等到之前的线程解锁之后,由操作系统唤醒⼀个新的线程, 再来获取到这个锁.

注意:

  • 上⼀个线程解锁之后,下⼀个线程并不是⽴即就能获取到锁.⽽是要靠操作系统来"唤醒".这也就 是操作系统线程调度的⼀部分工作.
  • 假设有ABC三个线程,线程A先获取到锁,然后B尝试获取锁,然后C再尝试获取锁,此时B和C
  • 都在阻塞队列中排队等待.但是当A释放锁之后,虽然B⽐C先来的,但是B不⼀定就能获取到锁,
    ⽽是和C重新竞争,并不遵守先来后到的规则.

synchronized的底层是使⽤操作系统的mutexlock实现的.

二、可重入性

synchronized同步块对同⼀条线程来说是可重入的,不会出现自己把自己锁死的问题;

Java中的synchronized是可重入锁

for (int i = 0; i < 50000; i++) {
	synchronized (locker) {
		synchronized (locker) {
			count++;
		}
	}
}

在可重入锁的内部,包含了"线程持有者"和"计数器"两个信息.

  1. 如果某个线程加锁的时候,发现锁已经被⼈占⽤,但是恰好占⽤的正是自己,那么仍然可以继续获取 到锁,并让计数器⾃增.
  2. 解锁的时候计数器递减为0的时候,才真正释放锁.(才能被别的线程获取到)

三、synchronized的使用

synchronized本质上要修改指定对象的"对象头".从使⽤⻆看,synchronized也势必要搭配⼀个具体的对象来使⽤.

  1. 修饰代码块:

明确指定锁哪个对象.

    1. 锁任意对象

代码如下:

public class SynchronizedDemo {

	private Object locker = new Object();
	
	public void method() {
		synchronized (locker) {
		}
	}
}
  1. 2 锁当前对象
    代码如下:
public class SynchronizedDemo {
	public void method() {
		synchronized (this) {
		}
	}
}
  1. 直接修饰普通⽅法:锁的SynchronizedDemo对象
public class SynchronizedDemo {
	public synchronized void methond() {
	}
}
  1. 修饰静态⽅法:锁的SynchronizedDemo类的对象
public class SynchronizedDemo {
	public synchronized static void method() {
	}
}

我们重点要理解,synchronized锁的是什么

两个线程竞争同⼀把锁,才会产⽣阻塞等待.
两个线程分别尝试获取两把不同的锁,不会产⽣竞争.

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

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

相关文章

【详谈】HashMAP深度剖析,全面消化吸收

【万字长文】 还没写完!!还没写完!!!还在码字中,只是先放上,防止又写着没了,自己文件没了… 最近,可以说的上自己博客停更大约有一两个月了,一直在忙于公司中的项目和业务,典型的牛马看了都流泪 今天,自己刚刚优化了一个查询耗时的BUG,在这里我就引入的hashmap作为我存储队列的…

Linux 某进程 CPU 高问题,用 Shell 脚本发现处理

发现高CPU使用率进程 首先&#xff0c;我们需要编写一个Shell脚本来发现系统中CPU使用率最高的进程。以下是一个简单的脚本示例&#xff1a; #!/bin/bash# 设置 CPU 使用率的阈值,一般设置90&#xff1b;这里是demo&#xff0c;所以用30 CPU_THRESHOLD30# 获取占用 CPU 最高的…

学习笔记 韩顺平 零基础30天学会Java(2024.7.24)

P416 匿名内部类本质 IA tiger new IA(){//IA是一个接口 //重写 System.out.println(“老虎叫唤。。。”); } P417 匿名内部类使用 基于类的匿名内部类 Father father new father(“jack”){};//不带大括号运行类型是Father&#xff0c;带大括号就是匿名内部类,相当于是匿名…

【深度学习入门】安装conda/miniconda、所需包类、CUDA与conda/Miniconda间的关系

深度学习入门 须知 本教程跟随李沐老师课程随笔&#xff0c;课程链接点击此处。 CUDA和Anaconda的关系 CUDA Toolkit是由Nvidia官方提供的完整工具包&#xff0c;其中提供了Nvidia驱动程序、开发CUDA程序相关的开发工具包等。 Anaconda在安装Pytorch等会用到的CUDA的框架时…

操作系统(三)中断----软中断

软中断与硬中断很像 软中断是纯软件实现的&#xff0c;宏观效果看上去和中断差不多的一种方式。 什么叫宏观效果呢&#xff1f;意思就是说&#xff0c;中断在宏观层面看来&#xff0c;就是打断当前正在运行的程序&#xff0c;转而去执行中断处理程序&#xff0c;执行完之后再返…

【Python机器学习】使用Matplotlib注解绘制树形图

通过数据集可以创建树&#xff0c;但是字典的表示形式非常不易于理解&#xff0c;而且直接绘制图形也比较困难。但是通过Matplotlib库可以绘制树形图。 决策树的主要优点就是直观、易于理解&#xff0c;如果不能将其直观的显示出来&#xff0c;就无法发挥其优势。 Matplotlib…

y=λsin(πx)分岔的研究

使用如下的迭代格式&#xff0c;λ为可变的参数 用如下代码对收敛的λ的值进行探究&#xff0c;这里的r代表λ %通过观察是否凝聚在同一个点来判断是否收敛 clear;clf; axis([0,4,0,4]); grid; hold on for r0:0.3:3.9x[0.1];for i2:150x(i)r*sin(pi*x(i-1));endpause(0.5);fo…

心动小站Ⅶ--人工智能的虚假承诺

前言 1770 年&#xff0c;匈牙利作家兼发明家 Wolfgang von Kempelen 推出了一款名为“土耳其机器人”的自动国际象棋机器。该机器在欧洲各地展示了其自动化国际象棋大师技能&#xff0c;在与人类对手的比赛中频频获胜。据说它甚至击败了拿破仑和本杰明富兰克林等著名人物。土…

Prometheus之数据类型和函数

前言&#xff1a; 在了解Prometheus数据类型前&#xff0c;我们先了解下面几个统计学名词概念&#xff1a; 平均数&#xff08;Mean&#xff09;&#xff1a; 平均数是所有数据加起来除以数据个数得到的结果。它表示数据的中心趋势。 最大值&#xff08;Maximum&#xff09…

Hadoop集群安装配置

文章目录 Hadoop部署配置集群配置历史服务器配置日志的聚集分发Hadoop群起集群Hadoop群起脚本 准备工作&#xff1a;需要3台虚拟机&#xff0c;每台虚拟机搭建好JDK并配置环境变量 Hadoop部署 1&#xff09;集群部署规划 注意&#xff1a;NameNode和SecondaryNameNode不要安…

Vue中el的两种写法

大家好我是前端寄术区博主PleaSure乐事。今天了解到了Vue当中有关el的两种写法&#xff0c;记录下来与大家分享&#xff0c;希望对大家有所帮助。 方法一 解释 第一种方法我们直接用new创建并初始化一个新的 Vue 实例&#xff0c;并定义了 Vue 实例的数据对象&#xff0c;在给…

数组算法--二分查找

目录 一.前言 二.算法的核心思路 三.算法的核心代码以注释详解 一.前言 二分查找也叫折中查找&#xff0c;为什么会这样叫呢&#xff1f;就是因为我们二分查找的核心逻辑就是每查找完一次&#xff0c;都能将查找的范围给缩小一半&#xff0c;也就是折中。但使用二分查找又有个…

宏VB的1004问题,方法作用于对象错误,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令

在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…

windows 下删除一个文件夹及其子文件夹下相同后缀名的文件

问题 我有一个工作目录&#xff0c;沉积了四五年的工作 文件。其中有一个相同格式的中间过程文件暂用很大体积&#xff0c;也不需要保留&#xff0c;并且可以通过其他文件生成。因此想一次删除这个工作目录下的所有相同后缀的文件。 解决方法 在工作目录的地址栏输入“cmd”…

leaflet【九】使用天地图改变地图底色

本文将详细探讨如何在Leaflet地图框架中集成天地图&#xff0c;并介绍如何通过调整背景色和滤镜来改变地图的显示效果。首先&#xff0c;我们将解释如何在Leaflet中配置天地图作为底图&#xff0c;包括API密钥的获取与使用。接下来&#xff0c;文章将展示如何通过CSS和JavaScri…

高等数学 第六讲 一元微分学的应用(二)_中值定理,微分等式,微分不等式

高等数学 第6讲 中值定理 微分等式 微分不等式 文章目录 高等数学 第6讲 中值定理 微分等式 微分不等式1.涉及函数的中值定理1.1 有界与最值定理1.2 介值定理1.3 平均值定理1.4 零点定理 2.涉及导数(微分)的中值定理2.1 导数零点定理2.2 罗尔定理2.3 拉格朗日中值定理2.4 柯西中…

如何利用Jenkins自动化管理、部署数百个应用

目录 1. Jenkins 安装与部署步骤 1.1 系统要求 1.2 安装步骤 1.2.1 Windows 系统 1.2.2 CentOS 系统 1.3 初次配置 2. Gradle 详细配置方式 2.1 安装 Gradle 2.1.1 Windows 系统 2.1.2 CentOS 系统 2.2 配置 Jenkins 中的 Gradle 3. JDK 详细配置方式 3.1 安装 JD…

【MSP430】DriverLib库函数,UCS函数分析

MSP430F5xx_6xx_DriverLib_Users_Guide-2_91_13_01(函数库手册).pdf 在MSP430单片机中&#xff0c;UCS&#xff08;User Clock System&#xff09;模块提供了一组函数用于配置和管理时钟源&#xff0c;包括外部和内部振荡器以及时钟信号的路由和控制。这些函数对于确保系统在正…

layui改造优化ITtools技术笔记01—layui.js重要修正

问题现象&#xff1a; ittools教学平台自动生成的单选按钮渲染后无法切换选项。 故障排查&#xff1a; input[name xxx]&#xff0c;其中xxx含有特殊字符&#xff0c;如$等&#xff0c;导致layui渲染时&#xff0c;表达式出错&#xff0c;无法及时渲染。 解决方案&#xff1…