free技术详解 lock_lock free的理解

free技术详解 lock_lock free的理解转自:http://www.isnowfy.com/understand-to-lock-free/以前一直不明白lockfree是什么,后来发现原来是完全理解错了概念,lockfree看到大家有的翻译为无锁,有的翻译为锁无关,其实用不用锁和lockfree是不相关的,用了锁也可能是lockfree,而不用锁有可能不是lockfree。一个lockfree的解释是一个“锁无关”的程序能…

大家好,又见面了,我是你们的朋友全栈君。

转自:http://www.isnowfy.com/understand-to-lock-free/

以前一直不明白lock free是什么,后来发现原来是完全理解错了概念,lock free看到大家有的翻译为无锁,有的翻译为锁无关,其实用不用锁和lock free是不相关的,用了锁也可能是lock free,而不用锁有可能不是lock free。

一个lock free的解释是

一个“锁无关”的程序能够确保执行它的所有线程中至少有一个能够继续往下执行。

其实看我们那副图就是说你的各个线程不会互相阻塞,那么你的程序才能成为lock free的。像我们平常用的互斥锁,当有线程获得锁,其他线程就被阻塞掉了,这里的问题就是如果获得锁的线程挂掉了,而且锁也没有释放,那么整个程序其实就被block在那了,而如果程序是lock free的那么即使有线程挂掉,也不影响整个程序继续向下进行,也就是系统在整体上而言是一直前进的。

那么,不用锁就是lock free的吗,一开始就提到了,不用锁也可能不是lock free的,举个例子

while (x == 0) {

x = 1-x;

}

在这里如果两个线程同时执行,可能同时进入while循环,然后x两次改变值之后,依然是0,那么两个线程就会一直互相在这里阻塞掉了,所以这里虽然没有锁,依然不是lock free的。

现在大家写lock free的时候一般都会使用CAS(compare and set)操作来写,因为现在很多的cpu都是支持CAS操作并作为原子操作来处理的,CAS操作一般是这样的

bool compare_and_swap (int *oldval, int *dest, int newval) {

if (*oldval == *dest) {

*dest = newval;

return true;

}

return false;

}

其实这样一个操作和乐观锁很像,并且操作简单,相应的比互斥锁的代价要小。所以现在大家都是喜欢用lock free的技术来提高系统的performance。

最后如果大家对于如何编写lock free的数据结构感兴趣的话,可以参考我后面给出的链接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161680.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Environment类,获取程序所在机器信息

    Environment类,获取程序所在机器信息

  • 实时操作系统UCOS学习笔记1—-UCOSII简介

    实时操作系统UCOS学习笔记1—-UCOSII简介前面我们所有的实验都是跑的裸机程序(裸奔),从本章开始,我们开始介绍UCOSII(实时多任务操作系统内核)。UCOSII简介UCOSII的前身是UCOS,最早出自于1992年美国嵌入式系统专家JeanJ.Labrosse在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把UCOS的源码发布在该杂志的BBS上。目前最新的版本:UCOSIII已经出来,但是现在使用最为广泛的还是UCOSII,本章主要针对UCOSII进行介绍。UCOSII是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核

  • java编译后执行 错误:找不到或无法加载主类「建议收藏」

    java编译后执行 错误:找不到或无法加载主类「建议收藏」使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析有时候我们需要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是很多初学者,但经常会发现如下提示:用eclipse或用ant则没有问题。其实原因很简单,我们忽略了2个细节。1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。2….

  • 小程序 轮播图之自动适应宽高度

    小程序 轮播图之自动适应宽高度以微信小程序为例:wxml文件:<!–1.轮播图外层容器swiper2.每一个轮播项swiper-item3.swiper标签存在默认样式1.width100%2.height150pximage存在默认宽度和高度320*2403.swiper高度无法实现由内容撑开4.先找出来原图的宽度和高度等比例给swiper定宽度和高度原图的宽度和高度750x300swiper宽度/.

  • PAT乙级题解

    PAT乙级题解题号C/C++B1001

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号