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的数据结构感兴趣的话,可以参考我后面给出的链接。

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Spring Cloud Security 整合 OAuth 2.0,从原理到实战一次说明白

    Spring Cloud Security 整合 OAuth 2.0,从原理到实战一次说明白若有收获,请记得分享和转发哦本篇文章介绍一下OAuth2.0相关的知识点,并且手把手带大家搭建一个认证授权中心、资源服务进行OAuth2.0四种授权模式的验证,案例源码详细,一梭子带大家了…

    2022年5月21日
  • ubuntu16.04安装pycharm_pycharm32位安装包

    ubuntu16.04安装pycharm_pycharm32位安装包1)下载pycharm专业版安装包之后2)解压缩到当前文件夹3)打开终端,进入pycharm-2018.1.4/bin;cdDownloads/pycharm-2018.1.4/bin4)执行pycharm.sh命令文件,开始安装;sh./pycharm.sh5)出现Complete-Installation提示框,如图5,如果需要导入之前安装版本的配置的话,就选第一个,没有就选第二个。所以这里选第二个,直接点OK6)激活激活方式:法1:a.Activationlice

    2022年8月29日
  • 如何设置网址跳转_怎么让域名跳转到另一个域名

    如何设置网址跳转_怎么让域名跳转到另一个域名一、什么是URL转发?URL(UniformResourceLocator:统一资源定位器)是WWW页的地址,它从左到右由下述部分组成:Internet资源类型(scheme):指出WWW客户程序用来操作的工具。如“http://”表示WWW服务器,“ftp://”表示FTP服务器,“gopher://”表示Gopher服务器,而“new:”表示Newgroup新闻组。服务器地址…

    2022年10月10日
  • layoutparams方法_LAYOUT

    layoutparams方法_LAYOUT沙翁向昨天要经验;向今天要结果;向明天要动力Android开发:LayoutParams的用法LayoutParams继承于Android.View.ViewGroup.LayoutParams.    LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout

    2022年9月21日
  • NLP词向量和句向量方法总结及实现

    NLP词向量和句向量方法总结及实现目录一、Word2Vec1、Word2Vec介绍2、Gensim实现Word2Vec3、基于Word2Vec的句向量4、基于加权Word2Vec的句向量5、基于Word2Vec的文本向量化实现二、GloVe1、GloVe介绍2、基于源码的GloVe词向量生成(Linux下实现)3、Gensim加载GloVe训练的词向量三、Doc2Vec1、Doc2V…

    2022年6月12日
  • shufflenetv2理解_算法笔记里有多少道题

    shufflenetv2理解_算法笔记里有多少道题论文:ShuffleNetV2:PracticalGuidelinesforEcientCNNArchitectureDesign论文链接:https://pan.baidu.com/s/1so7aD3hLKO-0PB8h4HWliw这篇是ECCV2018关于模型加速和压缩的文章,是之前ShuffleNet的升级版。这篇文章的观点和实验都比较新颖,看完还是有不少收获的,特来…

    2022年9月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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