提到无锁编程(lock-free),按字面最直观的理解是不使用锁的情况下实现多线程之间对变量同步和访问的一种程序设计实现方案。严格的说这个理解是不对的,Lock-Free的程序肯定是不包括锁机制的,而不包括锁机制的程序不一定是lock-free的。
更准确的说,在并发编程上按照同步的维护划分,可以分为阻塞的编程方式(Block)和非阻塞的编程方式(Non-blocking Synchronization)。阻塞的编程方式基本是基于锁的(lock-based)。 其中无锁编程(Lock-free)属于非阻塞同步(Non-blocking Synchronization)中的一种情况。
无锁编程按字面最直观的理解是不使用锁的情况下实现多线程之间对变量同步和访问的一种程序设计实现方案。一个锁无关的程序能够确保它所有线程中至少有一个能够继续往下执行,而有些线程可能会被的延迟。然而在整体上,在某个时刻至少有一个线程能够执行下去。作为整体进程总是在前进的,尽管有些线程的进度可能没有其它线程进行的快。
无锁编程就是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
多线程环境下,为了保证数据不受到并发操作的影响,通常会采用加锁的策略保证一致性。除了加锁之外,还有一种方式就是采用无锁编程。Java 中的无锁编程本质上就是一个 CAS(compare-and-swap)机制。CAS 是一个原子性操作,目前大部分的 CPU 都支持 CAS 指令, 能够使其在硬件层面上提供原子性操作。在 Intel 处理器中,CAS 通过指令 cmpxchg 实现,该机制在修改某个内存值的时候,会先比较内存值是否和给定的数值一致,如果一致则修改,不一致则不修改。由于这几步动作是原子操作,所以不必担心并发问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。