lock free(无锁并发)是什么

lock free(无锁并发)是什么一、非阻塞同步(Non-blockingSynchronization)1.无锁编程/lock-free/非阻塞同步无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blockingSynchronization)。实现非阻塞同步的方案称为“无锁编程算法”(Non-blockingalgorithm)。lock-free是目前最常见的无锁编程的实现级别(一共三种级别):wait-free l.

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

一、非阻塞同步(Non-blocking Synchronization)

1. 无锁编程 / lock-free / 非阻塞同步

无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。

实现非阻塞同步的方案称为“无锁编程算法”( Non-blocking algorithm)。

lock-free是目前最常见的无锁编程的实现级别(一共三种级别):

  • wait-free
  • lock-free
  • obstruction-free

 

2. 为什么要 Non-blocking sync ?

使用lock实现线程同步有很多缺点:

* 产生竞争时,线程被阻塞等待,无法做到线程实时响应。

* dead lock。

* live lock。

* 优先级翻转。

* 使用不当,造成性能下降。

 

3. wait-free

是最理想的模式,整个操作保证每个线程在有限步骤下完成。

保证系统级吞吐(system-wide throughput)以及无线程饥饿。

截止2011年,没有多少具体的实现。即使实现了,也需要依赖于具体CPU。

 

4. lock-free

允许个别线程饥饿,但保证系统级吞吐。

确保至少有一个线程能够继续执行。

wait-free的算法必定也是lock-free的。

 

5. obstruction-free

在任何时间点,一个线程被隔离为一个事务进行执行(其他线程suspended),并且在有限步骤内完成。

在执行过程中,一旦发现数据被修改(采用时间戳、版本号),则回滚

也叫做乐观锁,即乐观并发控制(OOC)

事务的过程是:1读取,并写时间戳;2准备写入,版本校验;3校验通过则写入,校验不通过,则回滚。

 

二、CAS

CAS( compare and swap) 原子操作,用来实现多线程下的变量同步

保证了如果需要更新的地址没有被其他进程(线程)改动过,那么它可以安全的写入。

而这也是我们对于某个数据或者数据结构加锁要保护的内容,保证读写的一致性,不出现dirty data。

 

CAS原语有三个参数:

  • 内存地址,
  • 期望值,
  • 新值。

 

算法逻辑:

  • 如果内存地址的值==期望值,表示该值未修改,此时可以修改成新值。
  • 否则表示修改失败,返回false,由用户决定后续操作。
int compare_and_swap (int* reg, int oldval, int newval) {
  ATOMIC();
  int old_reg_val = *reg;
  if (old_reg_val == oldval)
     *reg = newval;
  END_ATOMIC();
  return old_reg_val;
}

可在循环中不断执行CAS,如果共享变量没有改变,那么swap,在当前环境中写入,否则继续do-while的Retry-Loop。

 

 

三、ABA问题

ABA问题最容易发生在lock free算法中的,地址被重用的情况。

无锁相当于“锁”的粒度变小了,主要是“锁”HEAD和TAIL这两个关键资源。而不是整个数据结构。

 

thread1意图对val=1进行操作变成2,cas(*val,1,2)。

thread1先读取val=1;thread1被抢占(preempted),让thread2运行。

thread2 修改val=3,又修改回1。

thread1继续执行,发现期望值与“原值”(其实被修改过了)相同,完成CAS操作。

 

使用CAS会造成ABA问题,特别是在使用指针操作一些并发数据结构时。

 

解决方案

ABAʹ:添加额外的标记用来指示是否被修改。

# Java demo
 
AtomicInteger atom = new AtomicInteger(1);

boolean r = atom.compareAndSet(1, 2);

 

# C# demo

int i=1;

Interlocked.Increment(ref i);

 

 

 

https://www.cnblogs.com/demian/p/11141733.html

https://blog.csdn.net/nawenqiang/article/details/83027222

 

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

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

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


相关推荐

  • Django(4)操作指令大全[通俗易懂]

    Django(4)操作指令大全[通俗易懂]前言我们掌握了如何在命令提示符或PyCharm下创建Django项目和项目应用,无论是创建项目还是创建项目应用,都需要输入相关的指令才能得以实现,这些都是Django内置的操作指令。在PyChar

    2022年8月7日
    8
  • QStringList 去除重复项算法赏析

    QStringList 去除重复项算法赏析测试用例:QStringListlist;list<<"2222"<<"xxx"<<"1111"<<"2222"<<"xxxx"<<"1111";intn=list.removeDuplica

    2022年6月6日
    397
  • PLSQL注册码,亲测,可用

    PLSQL注册码,亲测,可用注册码:ProductCode:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserialNumber:601769password:xs374ca1.登录PLSQL,选择取消2.选择帮助,注册3.在弹出的注册框内填写上面的注册码,点击注册即可使用

    2022年7月24日
    17
  • Python使用pandas读取excel表格数据

    Python使用pandas读取excel表格数据导入importpandasaspd若使用的是Anaconda集成包则可直接使用,否则可能需要下载:pipinstallpandas读取表格并得到表格行列信息df=pd.read_excel(‘test.xlsx’)height,width=df.shapeprint(height,width,type(df))表格如下:得到如下输出,为一个4行5列的数据块:…

    2022年6月28日
    56
  • htc u11第三方rom_htc手机windows系统

    htc u11第三方rom_htc手机windows系统小弟写得差请勿拍砖,如果有意见请直接回复本贴!谢谢!技术有限,部分可能不详细或者错误的请各位指出,大家交流!前言:一个完整的ROM根目录会有以下几个文件夹及文件:dataMETA-INsystemboot.img系统目录说明1.应用程序安装目录1)系统应用程序所在目录/system/app/*.apk2)用户安装应用程序所在目录/

    2022年10月15日
    3
  • 基于python-scrapy框架的爬虫系统[通俗易懂]

    基于python-scrapy框架的爬虫系统[通俗易懂]爬虫简单介绍需要毕设的同学可以联系我:609997553/wechat:wwj901521一、爬虫:就是抓取网页数据的程序二、爬虫如何抓取:网页三大特征:网页都有自己唯一的URL(统一资源定位符)来进行定位网页都使用HTML(超文本标记语言)来描述页面信息。网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据。爬虫的设计思路:首先确定需要爬取的网页URL…

    2022年6月9日
    81

发表回复

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

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