无锁专题

阅读笔记(五)多线程无锁的C++实现《Lock-Free Data Structures》

1. 前言   本文介绍使用C++实现多线程中无锁算法的实现和优化过程。 2. 无锁&CAS   在多线程程序中,加锁是一种必要的手段,由于保证数据操作的正确性(原子性)。但是这也在很多时候带来了性能的极度下降,因为所有共享数据的操作均需要加锁,有些时候会严重影响性能,比如当读键盘或者一些较慢的I/O操作时,锁会延误了其他线程的操作。更糟糕的是,不当操作可能会带来死锁。   首先介绍最经典

无锁环形队列框架Disruptor不同策略说明

* <pre>* BlockingWaitStrategy: 这是默认的策略,使用BlockingWaitStrategy和使用BlockingQueue是非常类似的,* 他们都使用锁和条件Condition进行数据的监控和线程的唤醒,因为涉及到线程的切换,BlockingWaitStrategy策略* 是最节省cpu,但是高并发情况下性能表现最差的等待策略.* SleepingW

【CPP】单生产者单消费者无锁队列使用记录

无锁队列地址:https://github.com/cameron314/readerwriterqueue 该仓库提供三种队列: 无锁队列带阻塞与超时的无锁队列无锁环形缓存 以下通过三个官方例子与简要说明进行阐述。 1. 无锁队列 1.1 打印输出函数 #include <readerwriterqueue.h>#include <iostream>template <clas

Java并发基础:了解无锁CAS就从源码分析

CAS的全称为Compare And Swap,直译就是比较交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,其实现方式是基于硬件平台的汇编指令,在intel的CPU中,使用的是cmpxchg指令,就是说CAS是靠硬件实现的,从而在硬件层面提升效率。 CSA 原理 利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法,其它原子操作都

【翻译】RUST无锁编程

本文内容译自Lock-freedom without garbage collection,中间有少量自己的修改. 人们普遍认为,垃圾收集的一个优点是易于构建高性能的无锁数据结构。对这些数据结构进行手动内存管理并不容易,而 GC 使其变得非常简单。这篇文章表明,使用 Rust,可以为并发数据结构构建一个内存管理 API: 使得实现无锁数据结构和 有GC的语言(如Java) 一样容易;静态保护以防

【crossbeam系列】1有锁并发、无锁并发和crossbeam极简介

随着计算机硬件和软件的发展,个人计算机里动辄几千几万线程已经成为家常便饭。而在程序中大量使用并发也成为了一个主流,因为这样的程序有更小的延迟,并且对多核CPU也有更充分的利用。 有锁并发 对于大多数程序员(当然我也基本上是其中一员),并发编程几乎就等价于给相关数据结构加上一个锁(Mutex)。比如如果我们需要一个支持并发的栈,那最简单的方法就是给一个单线程的栈加上锁std::sync::Mute

环形无锁队列的简易实现

/** RingBuf.h** Created on: Feb 7, 2015 6:06:10 PM* Author: xuzewen*/#ifndef RINGBUF_H_#define RINGBUF_H_#include <libmisc.h>/**** 多/单线程生产, 只能单线程消费, 尺寸固定为0x10000.** */class RingBuf{public:us

Java中的CAS无锁并发原理是怎样的

CAS(Compare And Swap)即比较并交换,是一种无锁并发算法的核心原理。 简单来说,CAS 原理通过以下三个步骤来实现:     1.    读取当前值:获取目标变量当前的值。     2.    比较预期值:将读取到的值与预期的值进行比较。     3.    执行交换操作:如果比较结果符合预期,就进行值的交换。 CAS 的优点在于不需要使用传统的锁机制,从而避免了锁带来

Java锁的四种状态(无锁、偏向级锁、轻量级锁、重量级锁)

介绍 首先,我们需要明确一点:偏向级锁、轻量级锁、重量级锁只针对synchronized  锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。 这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率对synchronized 进

一步一步写线程之十二无锁编程

一、无锁编程 无锁编程并不是真正的无锁,只是在软件上消除了锁(或者说消除了传统认知中的锁)。牺牲CPU的占用时间来换取效率。无论是传统的单线程编程还是后来的多线程编程及至并发编程,其实抽象出来的模型就是生产者和消费者。这种生产者和消费者的模型,在很多情况下其实是不需要锁也不需要缓冲队列之类的,各自干各自的活就可以。但事情总不都是按照想象进行的,总有一些生产者和消费者的任务是不匹配的,在这种情况下

从源码解析Linux内核中的kfifo:C++实现单读单写无锁队列

kfifo 简介 kfifo是Linux内核的一个FIFO数据结构,采用环形循环队列的数据结构来实现,提供一个无边界的字节流服务,并且使用并行无锁编程技术,即单生产者单消费者场景下两个线程可以并发操作,不需要任何加锁行为就可以保证kfifo线程安全。 其数据结构如下: struct kfifo{unsigned char *buffer;unsigned int size;unsigned

无锁消息队列的设计实现

无锁队列的需求分析: 多线程访问共享队列的数据时,必须确保对共享队列操作的原子性,有以下情况: 1.生产者,例如tcp服务器接收到请求信息,需要将请求信息push进共享队列 2.消费者,例如线程池的工作线程,需要从共享队列中pop/get一个请求 这两种操作都要求对队列进行修改 确保原子性方式 1.对队列的修改操作加锁(系统调用), 可以确保共享队列的线程安全,但是性能较低,并且可能

ava并发编程-无锁CAS与Unsafe类及其并发包Atomic

在前面一篇博文中,我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其原理是通过当前线程持有当前对象锁,从而拥有访问权限,而其他没有持有当前对象锁的线程无法拥有访问权限,也就保证了线程安全。但在本篇中,我们将会详聊另外一种反向而行的并发策略,即无锁并发,即不加锁也能保证并发执行的安全性。 本篇的思路是先阐明无锁执行者

JUC并发-共享模型-无锁-乐观锁(非阻塞)

1、问题提出 有如下需求,保证 account.withdraw 取款方法的线程安全 public class TestAccount {public static void main(String[] args) {Account account = new AccountCas(10000);Account.demo(account);}}class AccountUnsafe impl

一文带你彻底理解高性能无锁队列

一文带你彻底理解高性能无锁队列 目前,大部分软件设计都在追求高性能,快速处理,耗时低,仿佛已经是行业中必不可少的一部分。作为互联网从业人员,我们也必须适应时代的潮流,彻底掌握这种高性能编程。 问题引入: 一个生产者,多个消费者的队列,如果是你,你回怎么设计? 想必拿到这个问题,更多的人脑海中已经浮现了一把锁;我也是的,那我们就从浅入深的来看看高性能的无锁队列是怎么一步一步的演化开来的

【JavaEE多线程】深入理解CAS操作:无锁编程的核心

目录 CAS什么是CASCAS是怎么实现的CAS有哪些应用实现原子类实现自旋锁 CAS的ABA问题 CAS 什么是CAS CAS:全称Compare and swap,字面意思:”比较并交换“,能够比较和交换某个寄存器中的值和内存中的值是否相等,如果相等,则把另一个寄存器中的值和内存进行交换。一个 CAS 涉及到以下操作: 我们假设内存中的原数据V,旧的预期值A,需

事务隔离级别的无锁实现方式 -- MVCC

MVCC的全称是Multiversion Concurrency Control(多版本并发控制器),是一种事务隔离级别的无锁的实现方式,用于提高事务的并发性能,即事务隔离级别的一种底层实现方式。 在了解MVCC之前,我们先来回顾一些简单的知识点:数据库的隔离级别和并发场景。 数据库的隔离级别 主要用来解决多个事务在并发的情况下对同一个数据进行读写操作所产生的一些列线程不安全的问题。 脏读

项目总结-无锁队列的链表实现

首先,无锁队列的实现基于原子操作CAS(_sync_vale_compare_and_swap) GCC下的CAS实现: bool __sync_bool_compare_and_swap (type *accum, type *dest, type newval){if(*accum==*dest){*dest=newval;return true;}return false;}type

多线程(49)定义无锁、阻塞、非阻塞和无等待算法

在并发编程中,理解不同的同步策略——无锁(Lock-Free)、阻塞(Blocking)、非阻塞(Non-Blocking)、无等待(Wait-Free)——对于设计高效、健壮的多线程应用至关重要。让我们更深入地探讨每种方法,并通过示例代码加以阐释。 阻塞(Blocking)算法 在阻塞算法中,线程尝试获取一个不可用的资源时会被挂起(即进入阻塞状态),直到资源变为可用。阻塞同步是最简单的同步机

无锁和无等待的定义和例子

原文链接,译文连接,译者:周可人,校对:梁海舰 在查阅google之后,我发现没有一处对并发算法或是数据结构规定的演进条件(progress condition,注:参考[1],译者认为翻译为演进状态更为合适)做合理的解释。甚至在”The Art of Multiprocessor Programming“中也只有围绕书本的一小段定义,大部分定义是单行的句子,因而造成了我们普通人含义模糊的理解,

Synchronized 的锁升级过程介绍(无锁 --> 偏向锁 --> 轻量级锁 --> 重量级锁 )

目录 Synchronized 的锁升级过程1、什么是锁1-1:JVM理解:1-2:对象头:1-3:synchronized 线程演示数字累加1-3-1:没加锁测试:1-3-2:加 synchronized 锁测试: 2、Synchronized 的锁升级过程锁为什么要升级?锁的四种实现(状态)1:无锁1-1:无竞争的情况2-1:存在竞争情况,非锁方式同步线程 2:偏向锁3:轻量级锁4:重

分配式调度器(Allocation Scheduler)-有锁与无锁实现

原文转自:http://www.tanjp.com (即时修正和更新) 分配式调度器(Allocation Scheduler) N个业务系统生产作业加入到 1个分配队列里面,由 1个分配线程负责将队列中作业分配给 M个工作队列,每个工作队列对应 1个工作线程来消费作业。对分配队列的抢占为:N*1,对工作队列的抢占为1*1,也就是说总体队列的抢占为 N*1+1*1*M,也就是 N+M。 分配

抢占式调度器(Preemptive Scheduler)-有锁与无锁实现

原文转自:http://www.tanjp.com (即时修正和更新)   抢占式调度器(Preemptive Scheduler) N个业务系统生产作业加入到一个队列里面,队列中的作业被 M个线程抢先消费。也就是说,N的业务系统抢着把生产出来的作业插入到队列,同时 M个线程抢着消费该队列的作业,对队列的抢占非常激烈。可简单竞争抽象为: N*M。            push

多线程无锁循环队列

转自:https://blog.csdn.net/weixin_40825228/article/details/80783860 1、Lamport提出的无锁SPSC队列。 在其论文【论文】中证明了,在遵守【顺序一致性】内存模型的计算机中,单生产者单消费者(SPSC)先进先出队列中的锁是可以去除的,从而得到了一个无锁队列,并第一次给出了并发无锁先进先出(Concurrent Lock-fre

多线程(四)——重入锁和读写锁以及CAS无锁机制

概念: 1、在java环境下ReentrantLock和synchronized都是可重入锁 2、非重入锁会导致死锁 3、重入锁,传递给下一个方法,重复使用 重入锁测试代码: package thread.pool;/*** 重入锁、非重入锁* @author Administrator**/public class Test5 implements Runnable {public sy

死锁、活锁、饥饿锁、无锁

死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。 举个例子,A同学抢了B同学的钢笔,B同学抢了A同学的书,两个人都相互占用对方的东西,都在让对方先还给自己自己再还,这