互斥锁和自旋锁分别适用于什么样的业务场景

        在多线程并发环境中,当某段代码被多个线程并发执行会导致数据不一致的情况出现时,我们就需要对这段代码加锁以保证线程安全了,我们可以对它施加互斥锁或者自旋锁,具体根据这段代码的执行耗时来定。

        互斥锁的特点是:一把互斥锁在同一时刻只能被一个线程所持有,当互斥锁被某个线程所持有时,其他来尝试获取这把锁的线程将获取失败,由运行状态切换到阻塞状态,阻塞在这把锁的外面等待,等待这把锁被释放之后重新进入到锁的竞争当中。因为获取锁失败的线程进入了阻塞状态,所以它释放了自己所占用的cpu内核,cpu内核被释放之后就可以去执行其它的操作了。

        自旋锁的特点是:一把自旋锁在同一时刻只能被一个线程所持有,当自旋锁被某个线程所持有时,其它来尝试获取这把锁的线程将获取失败,但获取失败后线程并不会进入阻塞状态,它依然是运行状态,依然占用着cpu内核,在这把锁的外部执行自旋,并不断地重试获取锁。

        自旋锁只适用于锁的持有时间比较短的业务场景,因为线程在自旋锁获取失败后仍然占用着cpu,如果在锁持有时间长的业务场景中使用自旋锁,会导致cpu被长时间用来进行自旋而降低cpu的使用效率。

        互斥锁适用于锁持有时间比较长的业务场景,以便让竞争锁失败的线程切换到阻塞状态释放cpu的执行权,让cpu去执行其它操作,提高cpu的执行效率。如果在锁的持有时间比较短的业务场景中使用互斥锁,会导致竞争锁失败的线程频繁地进行线程状态的切换,而线程状态切换是非常消耗cpu的一种操作,会降低执行性能。

        综上也能得出一个结论:线程不适合做频繁的状态切换操作;CPU内核也不适合将大量的时间消耗在让线程做自旋上。

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

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

相关文章

线程安全和可重入函数的联系与区别

1、 线程安全: 线程安全是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程访问完,其他线程才可以使用。不会出现数据不一致或数据污染。 线程不…

C++11 多线程 基础

C11开始支持多线程编程&#xff0c;之前多线程编程都需要系统的支持&#xff0c;在不同的系统下创建线程需要不同的API如pthread_create()&#xff0c;Createthread()&#xff0c;beginthread()等&#xff0c;使用起来都比较复杂&#xff0c;C11提供了新头文件<thread>、…

LB负载均衡集群--LVS

LB集群&#xff1a;LB集群是load balance 集群的简写&#xff0c;翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、keepalived &#xff0c;商业的硬件负载设备F5、Netscale。LB集群架构&#xff1a;当用户的请求过来时&#xff0c;会直接发到分发器&#xf…

linux 信号处理函数详解

转自&#xff1a;http://blog.csdn.NET/sddzycnqjn/article/details/7285760 1. 信号概念 信号是进程在运行过程中&#xff0c;由自身产生或由进程外部发过来的消息&#xff08;事件&#xff09;。信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示&#xff0…

2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

邱老师降临小行星 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61Description 人赢邱老师和任何男生比&#xff0c;都是不虚的。有一天&#xff0c;邱老师带妹子(们)来到了一个N行M列平面的小行星。对于每一个着陆地点&#xf…

优化表的数据类型

我们可以使用PROCEDURE ANALYSE()对当前已有应用的表类型的判断&#xff0c;该函数可以对数据表中的列的数据类型提出优化建议&#xff0c;可以根据应用的实际情况酌情考虑是否实施优化。语法&#xff1a; SELECT * FROM tbl_name PROCEDURE ANALYSE(); SELECT * FROM tb…

Linux 信号之mysleep

一、 用alarm和pause实现sleep(3)函数,称为mysleep。 1. main函数调用mysleep函数,后者调用sigaction注册了SIGALRM信号的处理函数sig_alrm。 2. 调用alarm(seconds)设定闹钟。 3. 调用pause等待,内核切换到别的进程运行。 4. seconds秒之后,闹钟超时,内核发SIGALRM给这个…

JAVA 操作系统已经来到第五个版本了 现陆续放出三个版本 这是第二个版本

1 package System2;2 3 import javax.swing.*;4 5 import java.awt.*;6 import java.awt.event.ActionEvent;7 import java.awt.event.ActionListener;8 import java.awt.event.KeyListener;9 import java.util.*;10 /**11 * 作者:范铭祥12 * 内容及功能&#xff1a; 显示框…

标准Web系统的架构分层

1、架构体系分层图 在上图中我们描述了Web系统架构中的组成部分。并且给出了每一层常用的技术组件/服务实现。需要注意以下几点&#xff1a; 系统架构是灵活的&#xff0c;根据需求的不同&#xff0c;不一定每一层的技术都需要使用。例如&#xff1a;一些简单的CRM系统可能在产…

数据链路层差错检测:CRC(循环冗余检验)

1、循环冗余检验&#xff08;CRC&#xff09;&#xff1a; 在发送端&#xff0c;先把数据划分为祖&#xff0c;假定每组K个比特。现假定待传送的数据M 101001&#xff08;k6&#xff09;。CRC运算就是在数据M后面添加提供差错检测的n位冗余码&#xff0c;然后构成一个帧发送出…

算法导论笔记:25所有节点对的最短路径问题

本章考虑在给定的有向加权图G(V, E)&#xff0c;对于所有的节点u,v∈V&#xff0c;找到一条从节点u到节点v的最短路径。希望以表格的形式表示输出&#xff1a;第u行第v列给出的是节点u到节点v的最短路径权重。 对于这个问题&#xff0c;如果是运行|V|次单源最短路径算法来解决所…

iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解

一、概要&#xff1a;前一篇初步的描述了size class的概念&#xff0c;那么实际中如何使用呢&#xff0c;下面两个问题是我们一定会遇到的&#xff1a;1、Xcode6中增加了size class&#xff0c;在storyboard中如何使用&#xff1f; 2、auto layout该如何与size class配合来进行…

Linux:守护进程解析、如何实现守护进程

1、守护进程&#xff1a; 守护进程也称精灵进程&#xff08;Daemon&#xff09;&#xff0c;是运行在后台的⼀一种特殊进程。它独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如…

CAS实现单点登录方案(SSO完整版)

一、简介 1、cas是由耶鲁大学研发的单点登录服务器 2、本教材所用环境 Tomcat7.2JDK1.7CAS Service 版本 cas-server-3.4.8-releaseCAS Client版本 cas-client-3.2.1-release 二、生成证书 证书对于实现此单点登录非常之重要&#xff0…

Java编程中“为了性能”需做的26件事

摘要&#xff1a;最近的机器内存又爆满了&#xff0c;除了新增机器内存外&#xff0c;还应该好好review一下我们的代码&#xff0c;有很多代码编写过于随意化&#xff0c;这些不好的习惯或对程序语言的不了解是应该好好打压打压了。 本文参考网络资源总结的一些在Java编程中尽可…

Linux:守护进程详解及实现

转载&#xff1a;守护进程 其实&#xff0c;linux提供了daemon函数用于创建守护进程&#xff0c;实现原理与上文中介绍的是一样的。 #include int daemon(int nochdir, int noclose); 1&#xff0e; daemon()函数主要用于希望脱离控制台&#xff0c;以守护进程形式在后台运行…

如何循环遍历document.querySelectorAll()方法返回的结果

使用JavaScript的forEach方法&#xff0c;我们可以轻松的循环一个数组&#xff0c;但如果你认为document.querySelectorAll()方法返回的应该是个数组&#xff0c;而使用forEach循环它&#xff1a; /* Will Not Work */ document.querySelectorAll(.module).forEach(function() …

软件开发的生命周期描述

软件项目的生命周期: 项目计划 需求分析 设计(概要设计和详细设计) 编码 测试 发布 维护 项目计划阶段&#xff1a;走访客户&#xff0c;进行交流沟通&#xff0c;获得客户原始需求。 对客户的需求和市场等进行调研&#xff0c;分析&#xff0c;编写可行性分析报告。 通过不断的…

PHP、C#、通用的DES加密

2019独角兽企业重金招聘Python工程师标准>>> PHP class JoDES {private static $_instance NULL;/*** return JoDES*/public static function share() {if (is_null(self::$_instance)) {self::$_instance new JoDES();}return self::$_instance;}/*** 加密* para…

如何防止头文件被重复包含或引用?

一、#pragma once ( 比较常用&#xff09; 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次&#xff0c;这条指令实际上在VC6中就已经有了&#xff0c;但是考虑到兼容性并没有太多的使用。 #pragmaonce是编译相关&#xff0c;就是说这个编译系统上能用&#xff…