
并发编程
文章平均质量分 76
书中自有颜如玉,书中自有黄金屋.
double_lifly
这个作者很懒,什么都没留下…
展开
-
CAS会产生什么问题以及如何解决
例如,在某些情况下,可以设置一个最大重试次数,当超过这个次数时,放弃 CAS 操作,采用其他方式处理;● 问题描述:在 CAS 操作中,如果竞争非常激烈,CAS 操作可能会多次失败,从而导致线程不断地进行重试,这会消耗大量的 CPU 资源,使程序的性能下降。综上所述,CAS 是一种高效的并发操作机制,但在使用时需要注意其可能产生的问题,并根据具体场景选择合适的解决方案。在上述代码中,当 CAS 操作失败时,会进行重试,但最多重试 5 次,超过这个次数则放弃更新操作。2. 循环时间长开销大。原创 2025-05-29 17:36:40 · 570 阅读 · 0 评论 -
深入理解 Java 中的 volatile 关键字:多线程编程的得力助手
原子性是指一个操作是不可分割的,要么全部执行,要么全部不执行。简单来说,当一个变量被声明为 volatile 时,它会保证对该变量的写操作会立即刷新到主内存中,而读操作会从主内存中读取最新的值,从而确保不同线程之间对该变量的操作能够及时可见。在上述代码中,虽然 count 变量被声明为 volatile 变量,但最终输出的 count 值可能会小于 10000,这是因为 count++ 操作不是原子操作,多个线程可能会同时读取到相同的 count 值,然后进行加 1 操作,导致部分操作丢失。原创 2025-05-28 11:31:41 · 227 阅读 · 0 评论 -
如何理解ThreadLocal
也就是说,调用ThreadLocal的set()方法存储的本地变量在具体线程的内存空间中,而ThreadLocal类支提供了set()和get()方法来存储和读取本地变量的值,当调用ThreadLocal类的set()方法时,把要存储的值存储在调用线程的threadLocals变量中,当调用ThreadLocal类的get()方法时,从当前线程的threadLocals变量中获取保存的值。保存数据时传递的key为当前ThreadLocal的this对象,而传递的value为调用set()方法传递的值。原创 2023-04-22 21:35:10 · 522 阅读 · 0 评论 -
如何理解线程池
当调用Executors.newSingleThreadExecutor方法创建线程池时,表示创建只有一个工作线程的线程池,即线程池中只有一个线程执行任务,能够保证提交到线程池中的所有任务按照先进先出的顺序,或者按照某个优先级的顺序来执行。如果在向线程池提交新任务时,线程池中无空闲线程,则新创建线程来执行任务。在调用shutdownNow()方法关闭线程时,线程池不能接受新提交的任务,也不能继续处理阻塞队列中的任务,同时,还会中断正在执行的线程,使得正在执行的任务被中断,线程池立即关闭并抛出异常。原创 2023-04-19 22:55:50 · 412 阅读 · 0 评论 -
如何理解CAS
ABA问题简单来说就是一个变量的初始值为A,被修改为B,然后再次被修改为A了。在使用CAS算法进行检测时,无法检测出A的值是否经历过被修改为B,又再次被修改为A的过程。原创 2023-04-08 15:09:53 · 898 阅读 · 0 评论 -
如何理解Lock
JDK层面提供了Lock锁都是通过Java提供的接口来手动解锁和释放锁的,所以在某种程度上,JDK中提供的Lock锁也叫显示锁、JDK提供的显示锁位于java.util.concurrent.locks包下,Lock接口的源码如下:lock()方法:阻塞模式抢占锁的方法。如果当前前程抢占锁成功,则继续向下执行程序的业务逻辑,否则,当前线程会阻塞。直到其他抢占到锁的线程释放锁后再继续抢占锁。lockInterruptibly()方法:可中断模式抢占锁的方法,当前线程在调用lockInterruptibl原创 2023-04-05 21:21:46 · 364 阅读 · 0 评论 -
如何理解AQS
这里需要结合acquireQueued()方法理解,当线程被唤醒后,会进入acquireQueued()方法中的if(p==head && tryAcquier(arg))逻辑判断,当条件成立是,被唤醒的线程会将自己所在的节点设置为head,表示已经获取到资源,此时,acquire()方法也执行完毕了。如果CAS操作设置成,则唤醒队列中的后继结点。在同步队列中,如果当前线程获取资源失败,就会通过addWaiter()方法将当前线程放入队列的尾部,并且保持自旋的状态,不判断自己所在的节点是否是队列的头结点。原创 2023-03-24 21:30:06 · 940 阅读 · 0 评论 -
如何理解Synchronized
synchronized是基于JVM中的monitor锁实现的,jdk1.5版本之前的synchronized锁性能较低,但是从jdk1.6版本开始,对synchronized锁进行了大量的优化,引入了锁粗化,锁消除,偏向锁,轻量级锁,适应性自旋等技术来提升synchronized锁的性能。无论synchronized修饰方法,还是修饰代码块,底层都是通过JVM调用操作系统的Mutex锁实现的,当线程被阻塞时会被挂起,等待CPU重新调度,这会导致线程在操作系统的用户态和内核态之间切换,影响程序的执行性能。原创 2023-03-22 18:14:50 · 332 阅读 · 0 评论 -
并发编程的三大核心问题(三)
类比现实案例并发编程中的分工同步问题类比现实案例并发编程中的同步互斥问题类比现实案例并发编程中的互斥原创 2022-07-07 22:43:44 · 168 阅读 · 0 评论 -
并发编程常见的锁介绍(二)
悲观锁和乐观锁公平锁与非公平锁独占锁和共享锁可中断锁与不可中断锁可重入锁与不可重入锁读/写锁自旋锁死锁/饥饿与活锁原创 2022-07-06 22:18:36 · 2686 阅读 · 0 评论 -
并发编程的一些概念(一)
主要介绍一些并发编程的一些基本概念,比如进程与线程,线程的一些基本概念,同步与异步,阻塞与非阻塞等原创 2022-07-05 22:16:30 · 156 阅读 · 0 评论