首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏后端精进之路

    Java并发编程系列-(7) Java线程安全

    7. 线程安全 7.1 线程安全的定义 如果多线程下使用这个类,不过多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的。 类的线程安全表现为: 操作的原子性 内存的可见性 不做正确的同步,在多个线程之间共享状态的时候,就会出现线程不安全。 加锁和CAS 加锁可以显示地控制线程对类的访问,使用正确可以保证线程安全。 CAS操作通过不断的循环对比,试图对目标对象进行修改,也能保证线程安全。广泛用于JDK并发容器的实现中。 安全的发布 类中持有的成员变量,特别是对象的引用,如果这个成员对象不是线程安全的,通过get等方法发布出去,会造成这个成员对象本身持有的数据在多线程下不正确的修改,从而造成整个类线程不安全的问题。 无锁 对于并发控制而言,锁是一种悲观的策略,它总是假设每一次的临界区操作会产生冲突,由此,如果有多个线程同时需要访问临界区资源,则宁可牺牲资源让线程进行等待。

    40420编辑于 2023-10-19
  • 来自专栏跟我一起学 K8s

    并发安全 map

    简介并发安全 map,上一篇讲解了go 源码自带的 sync.Map{} 的源码实现;本篇文章主要是根据 github.com/orcaman/concurrent-map 中的代码实现,然后进行了相关代码的重构 github.com/libranwmq/cmap,后续需要使用并发安全 map 的童鞋,欢迎使用新的仓库,记得别忘了 star 一下。 VKeys() []KTuples() []Tuple[K, V]Clear()UnmarshalJSON(b []byte) errorMarshalJSON() ([]byte, error)}这里就是并发 nocopy.NoCopyslotNum intsloting SlotingFunc[K]slots []*ConcurrentMapSlotted[K, V]}concurrentMap:实际并发存储的

    20111编辑于 2025-07-10
  • 来自专栏sktj

    Go 并发安全

    互斥锁 image.png 读写互斥锁 image.png 一次性初始化 image.png

    45910发布于 2019-07-16
  • 来自专栏python3

    7-并发编程

    t.start() for t in ts: t.join() 我们使用start启动多线程,使用 join 防止主线程退出的时候结束所有的线程,使用队列有序的且并发的下载壁纸 ) 输出: 进程2624 打印 0 进程2625 打印 1 进程2626 打印 3 进程2627 打印 2 进程2624 打印 4 进程2625 打印 5 进程2626 打印 6 进程2627 打印 7 正在消耗:9 时间:2019-01-09 12:50:48.708355 进程2804: 线程3 正在消耗:8 时间:2019-01-09 12:50:48.708355 进程2804: 线程2 正在消耗:7 www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431929340191970154d52b9d484b88a7b343708fcc60000

    45810发布于 2020-01-02
  • Go语言中的map是否并发安全?如何保证并发安全

    然而,在多线程并发的情况下,map 是否安全呢?如果你曾经在并发程序中使用过 map,你或许已经遇到过类似的问题:在多个goroutine并发读写 map 时,程序会崩溃或者结果不正确。 那么,Go语言中的 map 是否并发安全?我们该如何解决这个问题呢?今天,我们就来深入分析Go中 map 的并发安全问题,并讨论一些常见的解决方案。1. Go语言中的map并发安全问题Go语言中的 map 并不是并发安全的。也就是说,如果在多个goroutine中同时读写同一个 map,可能会引发运行时错误(runtime panic)。 因此,如果我们在并发环境中直接使用 map,没有采取任何同步机制,就会引发不安全的行为。 既然Go语言中的 map 并不是并发安全的,我们该如何解决这个问题呢?这里有几种常见的解决方案:3.1.

    35520编辑于 2025-09-04
  • 来自专栏张恒的网络日志

    JAVA7并发编程

    status状态有6种:new, runnable, blocked, waiting, time waiting, terminated

    56910发布于 2020-04-28
  • 来自专栏分享/效率/工具/软件

    并发基础之线程安全

    ://blog.csdn.net/qq_37933685/article/details/80862795 个人博客:https://suveng.github.io/blog/​​​​​​​ 线程安全 即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰 2.有序性 在并发时,程序的执行可能就会出现乱序 一条指令的执行是可以分为很多步骤的 取指 IF 译码和取寄存器操作数 ID 执行或者有效地址计算 方法先于它的每一个动作 线程的所有操作先于线程的终结(Thread.join()) 线程的中断(interrupt())先于被中断线程的代码 对象的构造函数执行结束先于finalize()方法 5.线程安全的概念

    37930发布于 2019-09-18
  • 来自专栏java大数据

    并发事务的数据安全

    1)目标的提出:并发事务的数据安全 马克-to-win:在互联网环境中,我们经常遇到比如:1)春节抢票系统。2)淘宝中大家同时下单买最后的几十个商品。 这就促成了一个著名的艰难话题形成:互联网环境下并发甚至 高并发下的数据安全。马克-to-win:通常都是一个用户浏览器的请求由服务器端单例的Servlet一个线程来应答,即一个用户浏览器对应一个线程。 所以解决了n个事务同时操作同一行数据的安全问题,也就解决了互联网环境下并发甚至高并发下的数据安全的核心问题。所以本节要研究的目 标确定:并发事务的数据安全。 2)一个实际的案例引发的问题:“网络并发数据安全” 马克-to-win:假设你账户有800元,你要在淘宝买衣服,衣服600元。同时,你老婆要从你的账上转走600元到她自己的账户。 并发修改同一个数据。所以并 发访问的确存在安全问题。 更多请看: https://blog.csdn.net/qq_44638460/article/details/104157095

    64530发布于 2021-08-03
  • 来自专栏JUC并发原理与源码

    JUC并发—9.并发安全集合二

    大纲1.并发安全的数组列表CopyOnWriteArrayList2.并发安全的链表队列ConcurrentLinkedQueue3.并发编程中的阻塞队列概述4.JUC的各种阻塞队列介绍5.LinkedBlockingQueue 的初始化并发安全的HashMap是ConcurrentHashMap并发安全的ArrayList是CopyOnWriteArrayList并发安全的LinkedList是ConcurrentLinkedQueue 所以CopyOnWriteArrayList可以保证多线程对数组写写 + 读写的并发安全并发安全的HashMap是ConcurrentHashMap并发安全的ArrayList是CopyOnWriteArrayList并发安全的LinkedList是ConcurrentLinkedQueue 为了保证多线程写的高并发性能,会大量采用CAS进行无锁化操作。同时会让很多读操作比如常见的size()操作,不使用锁。因此使用这些并发安全的集合时,要考虑并发下的统计数据的不一致问题。

    27710编辑于 2025-04-29
  • 来自专栏用户4352451的专栏

    并发安全问题总结

    什么是线程安全? 答:当并发的时候不会出现竞台条件,多个线程访问更改同一个资源的时候,这个数据不会出现意料之外的情况。 保证线程安全的几个基本特性? 代码层面的线程安全是如何体现的? 封装:通过封装,我们可以将对象内部状态隐藏、保护起来。

    71010发布于 2020-08-26
  • 来自专栏技术面面观

    Go 并发安全与锁

    并发安全,就是多个并发体在同一段时间内访问同一个共享数据,共享数据能被正确处理。” 个人建议只要涉及到共享变量统统使用channel,因为channel源码中使用了互斥锁,它是并发安全的。 我们可以不用,但不可以不了解,手中有粮心中不慌。 并发安全的例子 数组是并发安全的,在例子开始前我们要知道append函数的行为:长度足够在原数组cap内追加函数,增加len,长度不够则触发扩容,申请新数组cap增加一倍,赋值迁移。 以上并发操作的同一个资源,专业名词叫做临界区。 因为并发操作存在数据竞争,导致数据值意外改写,最后的结果与期待的不符,这种问题统称为竞态问题。 常见于控制商品减库存,控制余额增减等情况。 读写锁 互斥锁是完全互斥的,并发读没有修改的情况下是不会有问题的,也没有必要在并发读的时候加锁不然效率会变低。

    58720编辑于 2023-03-02
  • 来自专栏JUC并发原理与源码

    JUC并发—9.并发安全集合三

    大纲1.并发安全的数组列表CopyOnWriteArrayList2.并发安全的链表队列ConcurrentLinkedQueue3.并发编程中的阻塞队列概述4.JUC的各种阻塞队列介绍5.LinkedBlockingQueue 优先级阻塞队列PriorityBlockingQueue(4)延迟阻塞队列DelayQueue(5)无存储结构的阻塞队列SynchronousQueue(6)阻塞队列结合体LinkedTransferQueue(7) (7)双向阻塞队列LinkedBlockingDequeLinkedBlockingDeque是一个基于链表实现的双向阻塞队列,双向队列的两端都可以插入和移除元素,可减少多线程并发下的一半竞争。 (2)有界队列LinkedBlockingQueue一.并发安全的无界队列比如ConcurrentLinkedQueue,是没有边界没有大小限制的。它就是一个单向链表,可以无限制的往里面去存放数据。 二.并发安全的有界队列比如LinkedBlockingQueue,是有边界的有大小限制的。它也是一个单向链表,如果超过了限制,往队列里添加数据就会被阻塞。

    20700编辑于 2025-04-29
  • 来自专栏JUC并发原理与源码

    JUC并发—8.并发安全集合二

    在ConcurrentHashMap中,需要保证对该变量修改的并发安全。如果使用同步锁synchronized,那么性能开销比较大,不合适。 这是因为如果一个集合发生过并发,那么后续发生并发的可能性会更大。如果CAS累加baseCount失败,则尝试使用CounterCell来进行累加。 = null,再尝试对baseCount进行CAS累加 //这是因为如果一个集合发生过并发,那么后续发生并发的可能性会更大,这种思想在并发编程中很常见 if ((as = counterCells = null && b.hash >= 0) { synchronized (b) {//b就是链表,先用synchronized对b加锁,保证并发安全

    28510编辑于 2025-04-28
  • 来自专栏架构师成长之路

    java并发编程实战(7) 并发工具JUC之CountDownLatch

    这个修改的过程是通过CAS完成的,所以可以保证线程安全。 反之,如果修改state失败,则会将当前线程加入到AQS的队列中,并阻塞线程。

    61320编辑于 2022-04-14
  • 来自专栏狗哥的 Java 世界

    Java 并发7)CountDownLatch 源码分析

    这就是 CountDownLatch 的内部机制,看起来很简单,无非就是阻塞一部分线程让其在达到某个条件之后再执行。但是 CountDownLatch 的应用场景却比较广泛,只要你脑洞够大利用它就可以玩出各种花样。最常见的一个应用场景是开启多个线程同时执行某个任务,等到所有任务都执行完再统计汇总结果。下图动态演示了闭锁阻塞线程的整个过程。

    36010发布于 2020-04-07
  • 来自专栏java学习java

    JDK 7 HashMap 并发死链

    测试代码 注意 要在 JDK 7 下运行,JDK7以后否则扩容机制和 hash 的计算方法都变了 public static void main(String[] args) { // 测试 java 7 中哪些数字的 hash 结果相等 System.out.println("长度为16时,桶下标为1的key"); for (int i = 0 = e; // 再尝试将 e 作为链表头, 死链已成 e = next; // 虽然 next 是 null, 会进入下一个链表的复制, 但死链已经形成了 源码分析 HashMap 的并发死链发生在扩容时 null,但 e 被放入链表头,这样 e.next 变成了 35 (2 处) [1] (1,35)->(35,1)->(1,35) 已经是死链了 小结 究其原因,是因为在多线程环境下使用了非线程安全的 map 集合 JDK 8 虽然将扩容算法做了调整,不再将元素加入链表头(而是保持与扩容前一样的顺序),但仍不意味着能 够在多线程环境下能够安全扩容,还会出现其它问题(如扩容丢数据)

    33730编辑于 2023-10-15
  • 来自专栏JUC并发原理与源码

    JUC并发—8.并发安全集合一

    5.ConcurrentHashMap的Node数组初始化6.ConcurrentHashMap对Hash冲突的处理7.ConcurrentHashMap的并发扩容机制8.ConcurrentHashMap 2.ConcurrentHashMap的并发安全(1)如何理解ConcurrentHashMap的并发安全(2)ConcurrentHashMap在复合操作中的安全问题(3)ConcurrentMap可解决复合操作的安全问题 无法保证涉及多个线程的复合操作的正确性,复合操作会有并发安全问题。 如下代码在多线程并发调用时,会存在并发安全问题。虽然ConcurrentHashMap对于数据操作本身是安全的,但这里是复合操作,也就是"读—修改—写",而这三个操作作为一个整体却不是原子的。 ConcurrentHashMap是并发安全的,但对于其复合操作需要特别关注。

    23810编辑于 2025-04-28
  • 来自专栏别先生

    Java并发编程与高并发安全发布对象

    其次呢,线程看到的被发布对象的引用是最新的,然而呢,被发布对象的状态却是过期的,如果一个对象是可变对象,那么它就要被安全发布才可以。 2、安全发布对象的四种方式。    线程安全,推荐的方式。相比于懒汉模式,在安全性方面更容易保证,在饿汉模式,在安全性方面,在实际调用方面才可以初始化,不会造成资源的浪费。 线程安全,推荐的方式。 18 * 19 * 2、相比于懒汉模式,在安全性方面更容易保证,在饿汉模式,在安全性方面,在实际调用方面才可以初始化,不会造成资源的浪费。 27 private SingletonExample7() { 28 } 29 30 // 静态工厂方法 31 public static SingletonExample7 46 singletonExample7 = new SingletonExample7(); 47 } 48 49 // 提供一个方法方便类来获取

    78710发布于 2020-02-12
  • 来自专栏大猪的笔记

    go 并发安全map新宠:xsync

    在go中,官方实现了并发安全的sync.Map。它的出现有一定争议(性能勉强),但因为并发安全,在go中仍然广泛使用。 此外,它还提供了Counter,MPMCQueue(bounded multi-producer multi-consumer concurrent queue),RBMutex等多种并发安全结构。

    42810编辑于 2024-06-12
  • 来自专栏springboot

    Java并发编程之线程安全

    1、线程安全问题 1.1、 线程出现问题的根本原因分析 线程出现问题的根本原因是因为线程上下文切换,导致线程里的指令没有执行完就切换执行其它线程了 示例 public class Test { EightLockTest(); new Thread(() -> e1.a()).start(); new Thread(() -> e1.b()).start(); } } 7. 成员变量和静态变量的线程安全分析 如果变量没有在线程间共享,那么变量是安全的 如果变量在线程间共享   1)如果只有读操作,则线程安全   2)如果有读写操作,则这段代码是临界区,需要考虑线程安全 局部变量线程安全分析 局部变量【局部变量被初始化为基本数据类型】是安全的 但局部变量引用的对象则未必 (要看该对象是否被共享且被执行了读写操作)   1)如果该对象没有逃离方法的作用范围,它是线程安全的   2)如果该对象逃离方法的作用范围,需要考虑线程安全 线程安全的情况 局部变量表是存在于栈帧中, 而虚拟机栈中又包括很多栈帧, 虚拟机栈是线程私有的; 局部变量【局部变量被初始化为基本数据类型

    24810编辑于 2025-01-21
领券