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


相关推荐

  • python冒泡排序算法代码_python用冒泡法对10个数排序

    python冒泡排序算法代码_python用冒泡法对10个数排序Num01–>冒泡排序定义冒泡排序(英语:BubbleSort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

    2022年10月15日
    3
  • matlab fopen fread_matlab中prctile函数

    matlab fopen fread_matlab中prctile函数matlab中length函数length(x)在matlab中是什么意思?小编能记住你的一点一滴,你却忘了小编的一丝一毫。iflength(h)>1||h<0||h>2*breturn是什么意思?爱的仓促,就像行走于沙漠,风一场就没有了后路。length(x0)为数列的长度,即它里面有多少个元素。n=length(A):如果A为非空数组,返回行数和列数两者之间数…

    2022年9月13日
    3
  • 详解Java拦截器

    详解Java拦截器Interceptorsareusedtoimplementcross-cuttingconcerns,suchaslogging,auditing,andsecurity,fromthebusinesslogic.InJavaEE5,InterceptorswereallowedonlyonEJBs.InJavaEE6,Interceptorsbecameanewspecificationofitsown,abstracte.

    2022年5月2日
    91
  • mysql左连接 右连接 内连接的区别[通俗易懂]

    mysql左连接 右连接 内连接的区别[通俗易懂]1.内连接,显示两个表中有联系的所有数据;2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示3.右链接,以右表为参照显示数据,,左表中没有则以null显示例子:————————————————-a表idnameb表idjobparent_…

    2022年6月1日
    35
  • python中内置hash模块hashlib

    python中内置hash模块hashlib一、什么是hashhash,是一种对数据进行变换的算法,这种算法有以下特点:1.不定长输入,定长输出。2.不能被还原。由于算法过程中丢弃了一些数据,但是丢弃的是什么,丢弃了多少,谁也不知道,所以无法被还原,有点类似于有损压缩,丢弃的不可能被找回。3.相同输入,相同输出。4.抗碰撞性。即碰撞(不同输入产生相同输出)的几率特别小。5.抗篡改性。输入稍有改动,输出差别非常大。因为hash算…

    2022年5月2日
    55
  • JS获取当前时间(精确到秒)「建议收藏」

    JS获取当前时间(精确到秒)「建议收藏」js获取当前日期currentDate(){vard=newDate();varyear=d.getFullYear();varmonth=d.getMonth();month=month+1>12?1:month+1;month=month>9?month:”0″+month.toString();var

    2022年9月23日
    2

发表回复

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

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