
并发
文章平均质量分 88
并发
思静鱼
大道至简,行稳致远
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
进程之间的通信方式有哪些
进程间通信(IPC,Inter-Process Communication)是操作系统中不同进程之间交换数据或同步操作的机制。理解这些IPC方式的优缺点,能帮助你在实际开发中选择最合适的通信机制。原创 2025-07-09 17:10:58 · 467 阅读 · 0 评论 -
Semaphore 信号量
Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 的锁释放操作也由手动进行,因此与 ReentrantLock 一样,为避免线程因抛出异常而无法正常释放锁的情况发生,释放锁的操作也必须在 finally 代码块中完成。当多个线程请求访问资源时,公平模式保证线程按请求顺序获取许可,而不公平模式则可能导致一些线程长时间无法获取许可(例如,后来的线程可能在前面的线程之前获得许可)。原创 2024-11-22 18:02:11 · 805 阅读 · 0 评论 -
并发编程Atomic详解
简单来说就是原子类来实现CAS无锁模式的算法java.util.concurrent.atomic包:是原子类的小工具包,支持在单个变量上解除锁的线程安全编程原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。比如:AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int变量在读取和写入上有着相同的内存语义。它还提供了一个原子的 compareAndSet 方法(如果该。原创 2024-07-31 11:41:23 · 739 阅读 · 0 评论 -
并发编程AtomicInteger详解
AtomicInteger 是 Java 并发包 (java.util.concurrent.atomic) 中的一个原子变量类,用于对 int 类型的变量进行原子操作。AtomicInteger 是 Java 并发编程中非常有用的工具,提供了高效的原子操作,避免了使用锁的开销和复杂性。在这个示例中,AtomicInteger 确保了在多线程环境中对计数器的并发更新是线程安全的。AtomicInteger 常用于实现无锁算法,提供高效的并发控制。用于实现高效的线程安全计数器,避免使用传统的同步方法。原创 2024-07-31 11:17:40 · 478 阅读 · 0 评论 -
并发编程AtomicBoolean详解
AtomicBoolean 是 Java 中的一种原子变量类,提供了对布尔值进行原子操作的能力。它是 java.util.concurrent.atomic 包的一部分,使用了 CAS(Compare-And-Swap)机制来实现无锁的并发控制。AtomicBoolean 是一种高效的原子变量类,适用于需要以线程安全的方式对布尔值进行操作的场景。例如,控制一个线程是否应该停止运行。在这个示例中,AtomicBoolean 用于控制任务的启动和停止,确保任务在并发环境下可以正确地控制其运行状态。原创 2024-07-31 11:01:37 · 1117 阅读 · 0 评论 -
阻塞队列 BlockingQueue
阻塞队列(Blocking Queue)是 Java 并发编程中的重要工具,它是一个特殊的队列,具有阻塞操作的特性。在阻塞队列中,当队列为空时,从队列中获取元素的操作会被阻塞,直到队列中有可用元素;当队列已满时,往队列中添加元素的操作也会被阻塞,直到队列有空间可用。ArrayBlockingQueue:基于数组实现的有界阻塞队列。LinkedBlockingQueue:基于链表实现的有界或无界阻塞队列。PriorityBlockingQueue:基于优先级堆实现的无界阻塞队列。原创 2024-05-23 14:25:16 · 692 阅读 · 0 评论 -
AQS详情(AQS底层原理)
AQS(AbstractQueuedSynchronizer)是Java中并发编程的关键类之一,它提供了一种用于构建锁和其他同步器的框架。AQS内部维护了一个FIFO双向队列,用来管理获取同步状态失败的线程,并且通过内置的状态来控制线程的阻塞和唤醒。AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步状态。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能原创 2024-05-21 11:39:29 · 477 阅读 · 0 评论 -
CAS详解
CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加 version 来获取数据,性能较悲观锁有很大的提高。原创 2024-05-20 16:18:17 · 574 阅读 · 0 评论 -
volatile详解
volatile关键字Java 虚拟机提供最轻量级同步机制,它作为一个修饰符,用来修饰变量。它保证变量对所有线程可见性,禁止指令重排,但不保证原子性(1)多线程主要围绕可见性和原子性两个特性而展开,使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,一定是最新的数据(2)使用volatile则会对禁止语义重排序,当然这也一定程度上降低了代码执行效率可见性不保证原子性禁止指令重排(有序性)设置内存屏障来禁止指令重排。原创 2024-05-20 15:31:15 · 1118 阅读 · 0 评论 -
ThreadLocal详解
ThreadLocal 是 Java 提供的一个类,用于解决多线程中共享变量的问题。它提供了一种线程局部(thread-local)变量。这些变量不同于它们的正常变量,因为每一个访问这个变量的线程都有其自己的、独立初始化的变量副本。因此,线程局部变量不是多线程共享的,它们在线程的生命周期内起作用,是线程私有的。ThreadLocal 是 Java 中的一个线程封闭技术,它允许每个线程都有自己的局部变量,该变量对其他线程不可见,从而解决了多线程环境下共享变量的线程安全性问题。原创 2024-05-20 15:12:11 · 1010 阅读 · 0 评论 -
MySQL锁
Pessimistic Lock正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守悲观态度, 事务每次去操作数据的时候都假//设有其他事务会修改需要访问的数据,所以在访问之前都要求上锁,行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据)。原创 2024-05-20 13:58:15 · 693 阅读 · 0 评论 -
Java锁
但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功,占着 XX 不 XX,同时有大量线程在竞争一个锁,会导致获取锁的时间很长,线程自旋的消耗大于线程阻塞挂起操作的消耗,其它需要 cup 的线程又不能获取到 cpu,造成 cpu 的浪费。当事务想要获取某些行的排他锁时,它必须先获得表的意向排他锁。但是,通过意向锁,可以使得事务A等待的是表级锁的意向锁的释放,而事务B等待的是行级锁的意向锁的释放,这样可以避免死锁。原创 2024-05-20 13:38:46 · 1325 阅读 · 0 评论 -
java并发编程
其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由 JVM 从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。在数据库中,事务是由一系列操作组成的逻辑工作单元,原子性保证了事务的一致性,即事务要么全部执行,要么全部不执行。虽然并发编程中的原子性和数据库ACID中的原子性都涉及到确保操作的完整性,但它们的上下文和应用场景是不同的。原创 2024-05-20 11:22:18 · 1136 阅读 · 0 评论 -
ReentrantLock和 synchronized
synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为 轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。原创 2024-05-15 15:01:49 · 701 阅读 · 0 评论 -
Java线程
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程具有多种特性和用途:线程是独立调度和分派的基本单位。在多线程OS中,线程是能独立运行的基本单位,因此是花费最小开销的实体。线程具有原子性。原子性指的就是一个操作是不可中断,即使有多个线程执行,一个操作开始也不会受其他线程影响,即可以理解为线程的最小执行单元,不可被分割。线程具有可见性。原创 2024-05-15 11:09:25 · 812 阅读 · 0 评论 -
线程安全和线程同步
线程安全和线程同步是并发编程中的两个重要概念,它们有助于程序员确保多线程环境下程序的正确性和稳定性。线程安全:线程安全是指多线程环境下,程序能够正确、稳定地运行,不会出现数据不一致或者其他不可预料的结果。换句话说,线程安全的代码可以在多线程环境中无冲突地执行,每个线程都能得到正确的结果。避免共享状态:尽量让每个线程只操作自己的数据,避免多线程共享数据。使用同步机制:当必须共享数据时,使用同步机制(如锁)来确保数据访问的原子性和顺序性。原创 2024-05-15 10:40:50 · 790 阅读 · 0 评论 -
创建线程的方式
它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。3方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运 行 run 函数当中的代码。区别:调用的是start方法可以启动一条新的线程,并且start()方法的底层自动调用run()方法,调用run()方法不能启动新线程,相当于调用一个对象中的普通方法。实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,原创 2024-05-15 10:33:40 · 895 阅读 · 0 评论 -
高并发系统设计
设计高并发系统需要考虑多个方面,包括架构设计、数据库设计、缓存设计、负载均衡、容错与容灾等。水平扩展(Horizontal Scaling): 高并发系统通常需要水平扩展以应对大量的并发请求。这可以通过在系统的各个层级(如应用服务器、数据库等)增加更多的节点或实例来实现。负载均衡(Load Balancing): 使用负载均衡器来分发流量到多个服务器或实例上,确保每个服务器都能够处理适当的负载。负载均衡器可以基于不同的策略(如轮询、最少连接等)进行流量分发。原创 2024-05-14 13:42:40 · 1801 阅读 · 0 评论 -
乐观锁和悲观锁
悲观锁 坏事一定会发生,所以先做预防(上锁) 写多读少乐观锁:坏事不一定会发生,所以事后补偿 写少读多悲观锁 select for update,sychronized等,乐观锁,乐观锁如cas和版本号但是,如果使用悲观锁来实现的话,就会导致很多请求被迫阻塞并且排队,那么如果并发请求量很大的话,就可能直接把数据库给拖垮了。如果是乐观锁的话,可以用版本号的方式来控制有序行,但是这个问题在于高并发场景中会存在大量的失败,而。原创 2024-04-28 14:39:09 · 759 阅读 · 0 评论 -
线程安全和线程同步
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况不可变类,如 String、基本类型的包装类、BigInteger 和 BigDecimal 等。不可变对象天生是线程安全的线程安全是指多线程环境下,当多个线程同时访问共享资源时,保证对该资源的操作能够正确地执行,并且不会出现意外的结果或破坏数据的一致性。原创 2024-04-16 14:12:54 · 984 阅读 · 0 评论 -
线程池(通俗易懂)
线程池(ThreadPool)是一种用于管理和复用线程的机制,它能够在应用程序中创建一组预先初始化的线程,这些线程可用于执行任务,从而避免了不断创建和销毁线程的开销。Java中的线程池可以通过java.util.concurrent包中的ExecutorService接口及其实现类来实现。线程池的作用:○ 提高性能:线程池能够降低线程创建和销毁的开销,提高线程的重用率,从而提高应用程序的性能。○ 控制资源消耗:线程池能够限制同时运行的线程数量,避免因为线程过多导致系统资源不足,从而提高系统的稳定性。原创 2024-03-27 18:01:49 · 1350 阅读 · 0 评论 -
高并发接口限流方案
所谓限流,就是指限制流量请求的频次。它主要是在高并发情况下,用于保护系统的一种策略,主要是避免在流量高峰导致系统崩溃,造成系统不可用的问题。固定窗口计数器:该策略将时间划分为固定大小的窗口,在每个窗口内限制请求的数量。例如,每秒钟最多允许处理10个请求。如果超过了限制数量,则拒绝后续请求。这种方法简单直观,但可能会因为窗口切换瞬间的流量峰值而导致不均匀的限流效果。滑动窗口计数器:与固定窗口计数器类似,滑动窗口计数器也将时间划分为窗口,但窗口之间存在重叠。原创 2023-12-25 11:22:49 · 1923 阅读 · 0 评论 -
ForkJoinPool和ThreadPoolExecutor区别
ForkJoinPool和ThreadPoolExecutor的主要区别体现在任务执行的方式和适用的场景上。原创 2023-12-20 21:18:17 · 1944 阅读 · 0 评论