开发者社区> 问答> 正文

什么是无锁编程?

什么是无锁编程?

展开
收起
李博 bluemind 2019-03-22 18:06:46 6180 0
5 条回答
写回答
取消 提交回答
  •   提到无锁编程(lock-free),按字面最直观的理解是不使用锁的情况下实现多线程之间对变量同步和访问的一种程序设计实现方案。严格的说这个理解是不对的,Lock-Free的程序肯定是不包括锁机制的,而不包括锁机制的程序不一定是lock-free的。

     

    更准确的说,在并发编程上按照同步的维护划分,可以分为阻塞的编程方式(Block)和非阻塞的编程方式(Non-blocking Synchronization)。阻塞的编程方式基本是基于锁的(lock-based)。 其中无锁编程(Lock-free)属于非阻塞同步(Non-blocking Synchronization)中的一种情况。

    2019-07-17 23:31:42
    赞同 展开评论 打赏
  • 无锁编程按字面最直观的理解是不使用锁的情况下实现多线程之间对变量同步和访问的一种程序设计实现方案。一个锁无关的程序能够确保它所有线程中至少有一个能够继续往下执行,而有些线程可能会被的延迟。然而在整体上,在某个时刻至少有一个线程能够执行下去。作为整体进程总是在前进的,尽管有些线程的进度可能没有其它线程进行的快。

    2019-07-17 23:31:42
    赞同 展开评论 打赏
  • 本质就是CAS,先比较再设值,CAS本身是原子的,所以可以保证线程安全

    2019-07-17 23:31:42
    赞同 展开评论 打赏
  • Zzz
    开发

    无锁编程就是lockfree,可以google搜索一堆示例代码。上面也说了一些了,现代CPU都支持CAS的原子操作。

    CAS实现的Lock Free本质上就是说,当有两个线程同时操作一个值的时候,我再操作之前先读一下这个对象的值。

    操作完成后,我需要修改这个值的时候,做一次CAS操作,如果Compare成功,那么表示这时候没有其他线程对他进行修改,我直接SWAP,也就是修改这个值。这时候,有其他线程进来后,发现值已经和之前不一样了,也就是compare失败,则不修改。

    因为CAS是原子的,所以比较和swap不会有中间态,既可保证整个操作的无锁性,但是有ABA的情况,所以一般这个值的某几位,你需要设置一个操作序列号,每次操作需要+1


    无锁编程就是lockfree,可以google搜索一堆示例代码,现代CPU都支持CAS的原子操作。

    CAS实现的Lock Free本质上就是说,当有两个线程同时操作一个值的时候,我再操作之前先读一下这个对象的值。

    操作完成后,我需要修改这个值的时候,做一次CAS操作,如果Compare成功,那么表示这时候没有其他线程对他进行修改,我直接SWAP,也就是修改这个值。这时候,有其他线程进来后,发现值已经和之前不一样了,也就是compare失败,则不修改。

    因为CAS是原子的,所以比较和swap不会有中间态,既可保证整个操作的无锁性,但是有ABA的情况,所以一般这个值的某几位,你需要设置一个操作序列号,每次操作需要+1

    2019-07-17 23:31:42
    赞同 展开评论 打赏
  • 多线程环境下,为了保证数据不受到并发操作的影响,通常会采用加锁的策略保证一致性。除了加锁之外,还有一种方式就是采用无锁编程。Java 中的无锁编程本质上就是一个 CAS(compare-and-swap)机制。CAS 是一个原子性操作,目前大部分的 CPU 都支持 CAS 指令, 能够使其在硬件层面上提供原子性操作。在 Intel 处理器中,CAS 通过指令 cmpxchg 实现,该机制在修改某个内存值的时候,会先比较内存值是否和给定的数值一致,如果一致则修改,不一致则不修改。由于这几步动作是原子操作,所以不必担心并发问题。

    2019-07-17 23:31:42
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载