ICode9

精准搜索请尝试: 精确搜索
  • 解决并发问题的方法(有锁、无锁)2021-06-08 16:37:06

    1 并发问题解决的方式 无锁 局部变量 不可变对象 ThreadLocal 有锁 synchronized ReetrantLock 1.1 无锁的解决方式 1.1.1 局部变量 善用局部变量可以避免出现线程安全问题。 当每一个线程都运行同一行代码时,如果只是操作局部变量,则不可能会造成并发问题。因为每个线程操

  • 无锁队列MpscQueue源码分析2021-06-04 09:03:43

    前言 之前的文章在分析NioEventLoop源码的时候,有提到过Netty没有用JDK提供的阻塞队列,而是使用了高性能无锁队列MpscQueue。因为篇幅原因,那篇文章并没有详细介绍MpscQueue,今天,它来啦!!! ​ 在Netty较早的版本中,使用的是自己实现的任务队列,后来全部替换为JCTools工具的无锁化队列

  • 【crossbeam系列】2 crossbeam-epoch:基于epoch的无锁“垃圾收集”2021-05-09 09:54:06

    上次我们试图实现一个无锁的并发栈,但是发现由于Rust没有GC,简单的实现会导致内存泄漏。于是crossbeam提供了一个基于epoch的“垃圾收集”(epoch based reclamation)库。首先来简单的说一下这一垃圾回收的原理。基于epoch的“垃圾回收”这一算法主要在Keir Fraser的博士论文中有涉及

  • 无锁队列理解2021-04-05 20:57:09

            由于普通锁的粒度比较大,以至于在并发量高的环境下,锁对于并发性能影响很大,本文章对无锁队列做探索,该无锁队列目前只支持单读单写,上干货          该队列由链表组成,每个节点有N个泛型T组成,该队列实现对T类型元素单读单写的无锁操作,可以方便的用在单生产者消费

  • synchronized锁介绍2021-03-28 16:00:51

    本文主要介绍synchronized的锁实现。 锁的存储 Java中的每一个对象都可以作为锁。synchronized关键字分为如下三种场景: 修饰普通方法时,锁住的是调用该方法的对象实例修饰静态方法时,锁住的死当前类的Class对象修饰代码块时,锁住的是括号里的配置的对象 Java对象头内部有一个Mar

  • Java并发编程之 无锁(CAS)2021-03-26 16:30:57

    共享模型之无锁 文章目录 共享模型之无锁一、CAS 与 volatile1. CAS2. volatile3. 为什么无锁效率高4. CAS 的特点 二、原子整数三、原子引用1. AtomicReference2. ABA 问题3. AtomicStampedReference4. AtomicMarkableReference 四、原子数组五、原子更新器六、原子累加器

  • 【JUC】无锁、偏向锁、轻量级锁、重量级锁2021-03-03 21:02:11

    1.对象的结构    2.在mark word里面的 锁标志位    3.synchronized底层实现 synchronized经过javac编译之后,生成两个字节码 monitorenter moniterexit monitor是监视器(管程)的意思,监视器只允许1个线程进入。 结合下图 线程A进入监视器 进行运行,期间需要等待别的数据(类似于生

  • 我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程2021-02-24 22:54:04

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能的减少lock锁次数甚至没有。一:缘由1. 业务背景昨天在review代码的时候,看到以前

  • 无锁环形队列的一种高效实现2021-02-21 15:29:05

    1.环形队列是什么  队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元

  • 实用的无锁队列(二)2021-02-20 19:33:49

    上次的修改一下 链接在此:[无锁队列一] //c_buffer.h class c_data { private: s_memory v_root = NULL; s_memory *v_r = NULL; s_memory *v_w = NULL; int v_num = 0; public: ~c_data() { s_memory_block * pos = v_root.v_next; int num = 0; while (1) {

  • 一篇文章带你搞定高性能的生产者-消费者模式:无锁的实现2021-01-21 23:58:57

    用BlockigQueue队列实现生产者和消费者是一个不错的选择。它可以很自然地实现作为生产者和消费者的内存缓冲区。但是BlockigQueue队列并不是一个高性能的实现,它完全使用锁和阻塞等待来实现线程间的同步。在高并发场合,它的性能并不是特别的优越。就像之前我已经提过的:Concurre

  • 01-2 并发级别(阻塞、无饥饿、无障碍、无锁、无等待)2021-01-13 22:02:35

           由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为阻塞、无饥饿、无障碍、无锁、无等待几种。 1、阻塞        一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行,当我们使用synchronized关键字或者重入

  • 高性能的无锁队列 —— Mpsc Queue % CPU的伪共享问题2021-01-04 20:04:18

    NioEventLoop 线程以及时间轮 HashedWheelTimer 的任务队列中都出现了 Mpsc Queue 的身影。这又是 Netty 使用的什么 “黑科技” 呢?为什么不使用 JDK 原生的队列呢?Mpsc Queue 应该在什么场景下使用呢? 文章目录 JDK 原生并发队列 阻塞队列 非阻塞队列 Mpsc Queue 基础知识

  • 彻底理解理解 CAS,轻松学会2020-12-24 14:51:09

    CC老师,20年开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者参与和领导了上百个大中型项目,架构设计经验丰富。深入课程绝对会让你受益良多。 理解 CAS 1:理解无锁的概念,加锁、无锁、悲观、乐观 2:理解什么是 CAS 3:理解 CAS 的过程:图示 4:CAS 实现的基石:Unsa

  • 计算机组成-无锁编程追求极致性能2020-12-04 17:33:00

    前言 ​ 现代计算机通常由CPU,以及主板、内存、硬盘等主要硬件结构组成,而决定计算机性能的最核心部件是CPU+内存,CPU负责处理程序指令,内存负责存储指令执行结果。在这个工作机制当中CPU的读写效率其实是远远高于内存的,为提升执行效率减少CPU与内存的交互,一般在CPU上设计了缓存结构

  • 无锁工具类2020-11-23 21:01:06

    文章目录 一.示例二.无锁方案实现原理三.原子类3.1 原子化的基本数据类型3.2 原子化的对象引用类型3.3 原子化数组3.4 原子化对象属性更新器3.5 原子化的累加器 一.示例 累加器示例。 public class Test { AtomicLong count = new AtomicLong(0); void add10K

  • 实战Java高并发程序设计模式2020-07-15 21:31:30

    死锁、饥饿、活锁的概念。并发级别:阻塞、饥饿、无障碍、无锁、无等待。无障碍:是一种最弱的非阻塞调度。两个线程如果是无障碍的执行,那么他们不会因为临界区的问题导致一方被挂起。但是一旦检测到冲突,就应该进行回滚。 无锁:无锁的并行都是无障碍的,在无锁的情况下,所有的线程都能尝试

  • 无锁编程2020-07-15 10:02:53

    参考资料: An Introduction to Lock-Free Programming Weak vs. Strong Memory Models 透过 Linux 内核看无锁编程 阻塞型同步和非阻塞型同步 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。 同步可分为阻塞型同步(Blocking Synchronization)和非

  • Synchronized2020-06-09 15:51:28

    锁升级: 无锁——偏向锁——轻量级锁——重量级锁 锁降级很难发生,条件很苛刻。         锁的比较    锁变化流程:  

  • 关于 锁的四种状态与锁升级过程 图文详解2020-06-06 12:53:49

    一、前言 锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率对(synchronized )进行了优化,引入

  • 线程安全的无锁RingBuffer的实现2019-12-19 14:54:21

    本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q   在程序设计中,我们有时会遇到这样的情况,一个线程将数据写到一个buffer中,另

  • Java 中有哪些无锁技术来解决并发问题?如何使用?2019-10-16 20:04:14

    除了使用 synchronized、Lock 加锁之外,Java 中还有很多不需要加锁就可以解决并发问题的工具类   1、原子工具类 JDK 1.8 中,java.util.concurrent.atomic 包下类都是原子类,原子类都是基于 sun.misc.Unsafe 实现的。 CPU 为了解决并发问题,提供了 CAS 指令,全称 Compare And Swap,即

  • 并发编程之锁2019-09-15 14:00:09

    1.轻量级锁(Lock)与重量级锁(synchronized):都是可重入锁 2.可重入锁(递归锁):方法中嵌套方法,锁可传递 3.读写锁(ReentrantReadWriteLock)--读写分离    读锁(获取该值信息)和写锁(对该值操作) 4.乐观锁    本质没有锁,效率比较高、无阻塞、无等待、重试。 5.悲观锁    属于重

  • 1 走进并行世界2019-08-28 09:57:10

    需要知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步方法调用一旦开始,调用者必须等到方法调用返回后,才继续执行后续行为。 异步方法一旦开始,方法调用会立即返回,调用者就可以继续执行后续行为。而异步方法通常会在另外一个线程“真实”地执行,当这个异步调用真实完成时,则会

  • 多线程(9) — 无锁2019-08-09 23:58:05

      对于并发控制而言,锁是一种悲观策略,它总是假设每一次的临界区操作会产生冲突。如果有多个线程同时需要访问临界区资源,则宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。而无锁是一种乐观策略,它会假设对资源的访问是没有冲突的,既然没有冲突就不会让线程等待,所有线程可以在

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有