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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Repository XXX does not have a Realease file「建议收藏」

    问题描述:E:Therepository‘http://ppa.launchpad.net/noobslab/deepin-sc/ubuntubionicRelease’doesnothaveaReleasefile.解决方案:cd/etc/apt/sources.list.dlssudormnoobslab-ubuntu-deepi…

    2022年4月7日
    43
  • char (*p)[]和char *p[]的区别[建议收藏]

    理解的关键在于:1.[]的优先级高于*,(*p)[]理解为指向一个数组,*(p[])存放指针的数组2. char(*p)[SIZE]:指向一维数组的指针,一维数组只能有SIZE个元素

    2021年12月18日
    38
  • gateway网关详解_天翼网关扩展wifi

    gateway网关详解_天翼网关扩展wifi文章目录Gateway简介网关的功能搭建Gateway网关路由断言工厂路由过滤器全局过滤器过滤器执行顺序跨域问题处理Gateway简介Gateway是SpringCloud中的网关组件,SpringCloudGateway旨在提供一种简单而有效的方式来路由到API。SpringCloud在1.x版本中都是使用Zuul网关,但在2.x版本中使用Gateway替代了Zuul。Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的We

    2022年10月11日
    2
  • scrapy ip池(scrapy多线程)

    反爬策略有很多,最常用的也就是ip池,下面让我们一起跟着小省开始ip池之旅吧直接上代码:由于我们的ip池是自己维护在数据库中的,所以会有查库这一说#!/usr/bin/envpython#-*-coding:utf-8-*-#Createbyshengjk1on2017/11/6fromscreptileimportpoolfromutilspider.dp

    2022年4月15日
    130
  • c++和java区别_科普:Java 和 C++ 有何区别[通俗易懂]

    c++和java区别_科普:Java 和 C++ 有何区别[通俗易懂]我是一名Java工程师,平时用C++的时候并不多,这篇文章讲述了两者的区别。欢迎大家关注我。Java和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于C++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!Java则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多…

    2022年7月7日
    28
  • 【Oracle】LISTAGG 函数的使用

    【Oracle】LISTAGG 函数的使用LISTAGG 函数介绍 listagg 函数是 Oracle11 2 推出的新特性 其主要功能类似于 wmsys wm concat 函数 即将数据分组后 把指定列的数据再通过指定符号合并 LISTAGG 使用 listagg 函数有两个参数 1 要合并的列名 2 自定义连接符号 LISTAGG 函数既是分析函数 也是聚合函数所以 它有两种用法 1 分析函数

    2025年7月23日
    2

发表回复

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

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