线程的互斥与同步机制

同个人博客:http://tsundere-x.top/

一、互斥

为何需要引入互斥机制?

当多个线程对同一数据并发读写(至少有一个线程执行写操作)时,这种情形被称为竞争。竞争会导致数据读或写的不确定性。而有时这种不确定性是不可容忍的。

如何实现互斥?

在并发程序设计中,通常使用锁机制来实现互斥

1、由用户标记必须原子执行的代码段,即使用synchronized关键字

2、给资源一把配有自动机制的锁

【注意】

Java将资源限定为引用型对象,并为每一对象自动配备一把锁:锁初始时处于打开状态。synchronized标记的原子代码段在访问资源前,会自动检测资源对象持有的锁是否处于打开状态。若是,则占用并同时将锁置为锁闭态,并在该代码段执行完毕后。将锁的状态值为打开态;若否,则持有该代码的线程因等待资源占用而进入阻塞态。

• 只有对象才有锁,对基本类型的数据,无法实现线程的互斥访问。

• 对于未使用synchronized标记的代码,锁机制不起作用。

• 无论正常结束还是异常退出,都将自动释放锁。

死锁和活锁

死锁:就是多个线程对临界资源的循环等待,使得这些线程均都无法获得执行。

例如:A,B,C三个线程分别占用D1、D2、D3三个临界资源,A只有获得B占用的资源D2,方能继续运行;而B只有获得C占用的资源D3,方能继续运行;C只有获得A占用的资源D1,方能继续运行。这样,A,B,C处在对资源的循环等待状态,均无法前进。

活锁:也称饥饿。就是某线程虽有执行的资格,但由于某种原因总是得不到执行。

例如:A,B,C三个线程循环访问临界资源D,但A,B的优先级相同,但均高于C。由于Java的抢占式策略,C线程可能总得不到执行。

二、同步

同步(Sync)

多个线程的运行满足特定的节奏

所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。

根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。

简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。

异步(Async)

多个线程的运行相互独立,彼此间无依赖性

异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。

举个例子简单说明下两者的区别:

同步:火车站多个窗口卖火车票,假设A窗口当卖第288张时,在这个短暂的过程中,其他窗口都不能卖这张票,也不能继续往下卖,必须这张票处理完其他窗口才能继续卖票。直白点说就是当你看见程序里出现synchronized这个关键字,将任务锁起来,当某个线程进来时,不能让其他线程继续进来,那就代表是同步了。

异步:当我们用手机下载某个视频时,我们大多数人都不会一直等着这个视频下载完,而是在下载的过程看看手机里的其他东西,比如用qq或者是微信聊聊天,这种的就是异步,你执行你的,我执行我的,互不干扰。比如上面卖火车票,如果多个窗口之间互不影响,我行我素,A窗口卖到第288张了,B窗口不管A窗口,自己也卖第288张票,那显然会出错了。

并发

在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥。

并行

在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事 件之间不一定要同一时刻发生。

Java的同步机制 = 存取共享资源的互斥机制 + 线程间的通信机制

用于线程通信的方法存在于Object类中,包括wait()、notify()、notifyAll()。wait()会暂停当前线程的执行,并释放所持有的锁,进入等待状态;notify()操作将唤醒一个等待的线程;notifyAll()将唤醒所有等待的进程。

【注意】

wait()、notify()、notifyAll()都是final方法,不允许被重写;这些方法只能直接或间接地用于临界区中,否则,将会产生非法监控锁状态异常。

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

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

相关文章

欢迎参加“城市大脑与应急管理”专家研讨会

来源:城市大脑全球标准研究组数字大脑学术系列沙龙第二期“城市大脑与应急管理”专家研讨会2021以来城市大脑的建设与研究获得了长足发展,数百个城市开展了城市大脑的建设与规划,取得了诸多成果。于此同时,伴随着疫情、水灾、交通…

MapReduce词频统计

1.1 文件准备 创建本地目录和创建两个文本文件,在两个文件中输入单词,用于统计词频。 cd /usr/local/hadoop mkdir WordFile cd WordFile touch wordfile1.txt touch wordfile2.txt1.2 创建一个HDFS目录,在本地上不可见,并将本地文本文件上传…

炼数成金 Oracle EBS R12 DBA培训视频教程

----------------------课程目录------------------------------├01_第一课EBSDBA概要├02_第二课 EBSDBA 安装├02_第二课 R12 Linux x86 64bit installation├03_第三周 EBSDBA 架构├04_第四周EBSDBA-基本管理├05_第五周EBSDBA-OAM├06_第六周EBSDBA-sysadmin├07_第7周E…

Spring中注解大全

Spring中注解大全 Controller 标识一个该类是Spring MVC controller 处理器&#xff0c;用来创建处理http请求的对象 Controller public class TestController{RequestMapping("test")public String test(Map<String,Object> map){return "hello"…

Linux系统组成

1 系统组成 BootLoader&#xff1a;操作系统引导程序 内核&#xff1a; 文件系统&#xff1a;应用程序(用户开发的、网上下载的) 2 安装USB驱动 dongryd-linux:~$ insmod usb_dnw.ko //安装USB驱动 dongryd-linux:~$ kernel:GuoQian USB driver for DMW! //出现这一句说明驱动…

使用github托管代码以及github一些最常用的命令

生成SSH密钥 首先打开命令行工具&#xff0c;右键鼠标任意位置打开git bash here,然后输入以下命令 cd ~/.ssh 使用ssh-keygen生成密钥 ssh-keygen -t rsa -C "我的邮箱地址" 使用默认的文件名&#xff0c;输入密码&#xff0c;密钥生成成功 直接复制命令行看到的密钥…

Hive安装与配置MySQL元数据库

一.MySQL的安装 1.1 更新获取最新软件源&#xff0c;并安装MySQL。 sudo apt-get update sudo apt-get install mysql-server1.2 启动和关闭MySQL服务器。 service mysql start service mysql stop1.3 确认MySQL 是否启动成功&#xff0c;MySQL 处于LISTEN状态则表示启动成功…

国际领先的人工智能团队值得我们学习和深思

‍来源&#xff1a;陈德旺科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-57940-1299162.html如其说&#xff0c;人工智能&#xff08;AI&#xff09;现今热潮是Hinton等图灵奖获得者引发的&#xff0c;不如说是DeepMind&#xff08;深度思考&#xff0c;简称深…

C - 思考使用差分简化区间操作

FJs N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of that cow. F…

Curr Biol:间隔学习可巩固记忆的奥秘

来源&#xff1a;brainnews已有一些实验现象表明当把连续的学习过程在一定时间范围内做间隔&#xff08;spaced&#xff09;后&#xff0c;学习效率将大大提高&#xff0c;这种效应称为“间隔效应”。然而迄今为止尚未有进一步的研究来探索间隔学习是如何影响与记忆相关的神经环…

Flume原理及使用案例

本文为转载篇&#xff01;原文&#xff1a; https://www.cnblogs.com/zhangyinhua/p/7803486.html https://www.cnblogs.com/ciade/p/5495218.html 原理 一、Flume简介 flume 作为 cloudera 开发的实时日志收集系统&#xff0c;受到了业界的认可与广泛应用。Flume 初始的发行版…

Hadoop相关技术

一.Hadoop 的优化与发展 1.1 局限与不足 抽象层次低&#xff0c;需要人工编码&#xff1b;表达能力有限&#xff1b;开发者自己管理作业之间的依赖关系&#xff1b;难于看到程序的整体的逻辑&#xff1b;执行迭代操作效率低;实时性差&#xff1b;资源浪费&#xff1b; 1.2 改…

网络的性能指标与分组交换网络

同个人网站&#xff1a;http://tsundere-x.top/ 计算机网络概述&#xff08;三&#xff09; 计算机网络概述&#xff08;一&#xff09; 网络协议 网络协议规定了通信双方具体的通信规则&#xff0c;包括消息的传递细节。协议的三要素&#xff1a;语法、语义、同步 语义&#…

Hadoop分布式集群安装配置

1.1 安装环境 操作系统deepin 15.11, VMware Workstation&#xff0c;hadoop 3.1.3 版本。在deepin 操作系统中安装 VMware Workstation&#xff0c;在 VMware Workstation中安装两个deepin系统&#xff0c;采用两个节点作为集群环境&#xff0c;一个作为Master节点&#xff0…

复杂性理论研究的核心问题是什么

文章来源&#xff1a;学习时报作者&#xff1a;陈一壮我曾提出复杂性理论的核心不是一般的涌现而是自组织&#xff0c;以突出其相对于传统系统论的特点。普利高津也讲到过&#xff1a;“复杂性诞生”于“物理―化学系统的自组织”。但是我又想到必须对这个自组织的概念作进一步…

【译】索引进阶(四):页和区

【译注&#xff1a;此文为翻译&#xff0c;由于本人水平所限&#xff0c;疏漏在所难免&#xff0c;欢迎探讨指正】 原文链接&#xff1a;传送门。 在之前的章节中&#xff0c;我们在有索引和没有索引的情况下执行同一个查询&#xff0c;比较了各自需要的工作。我们的最主要的评…

网络体系结构

计算机网络的体系结构 网络体系结构是从功能上描述计算机网络结构计算机网络体系结构简称网络体系结构&#xff0c;是分层结构每层遵循某个/些网络协议完成本层功能计算机网络体系结构是计算机网络各层及其协议的集合体系结构是一个计算机网络的功能层次及其关系的定义体系结构…

计算机网络安全-RSA加密原理

一. 安全的攻击类型 危及信息安全的举动. 中断&#xff1a;对可用性的攻击&#xff0c;包括对硬件,通信线路的破坏等&#xff1b; 截获:对机密性的攻击&#xff0c;如窃听等&#xff1b; 篡改&#xff1a;对完整性的攻击&#xff0c;如改变数据或文件&#xff1b; 伪造&…

为什么神经网络不适合理解自然语言 ?

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;王强策划&#xff1a;刘燕过去十年中&#xff0c;人工智能行业的一大趋势就是通过创建更大的深度学习模型来解决问题。这种趋势在自然语言处理领域最为明显&#xff0c;这也是人工智能最具挑战性的领域之一。…

Spark详解

一.Spark 简介 Spark 和Scala 1.1 Spark 是基于内存计算的大数据并行计算框架&#xff0c;可用于构建大型的、低延迟的数据分析应用程序&#xff1b; 1.2 Spark 的特点&#xff1a; 1.3 Scala是一门现代的多范式编程语言&#xff0c;可扩展式语言&#xff1b; 1.4 Scala 特性&…