java并发编程
文章平均质量分 68
介绍java并发编程相关
青鱼入云
这个作者很懒,什么都没留下…
展开
-
判断线程池任务执行完成的方式
Thread线程是否执行完成,我们可以调用join方法然后等待线程执行完成;那在使用线程池的时候,我们如何知道线程已经执行完成了?本文就带给大家五种判断的方式:● isTerminated() 方式,在执行 shutdown() ,关闭线程池后,判断是否所有任务已经完成。● ThreadPoolExecutor 的 getCompletedTaskCount() 方法,判断完成任务数和全部任务数是否相等。● CountDownLatch计数器,使用闭锁计数来判断是否全部完成。原创 2023-11-21 20:28:06 · 1593 阅读 · 0 评论 -
如何停止一个正在运行的线程
3. 使用Thread.stop方法(不推荐使用):Thread.stop方法可以强制停止一个线程,但不建议使用它,因为它可能导致线程的状态不一致和资源泄漏等问题,容易引发不可预测的错误。4. 使用ExecutorService: 如果线程是通过ExecutorService创建的,可以使用shutdown或shutdownNow方法来停止线程池中的线程。要停止一个正在运行的线程,通常有几种方法,但需要根据具体情况选择适当的方式,因为线程的停止涉及到线程安全和资源释放等问题。原创 2023-11-21 19:19:01 · 202 阅读 · 0 评论 -
有三个线程T1,T2,T3,如何保证顺序执行
确保三个线程 T1、T2、T3 按照指定顺序执行有多种方式。这些方法都可以用来确保线程按照指定顺序执行。选择其中一种方式取决于你的具体需求和场景。原创 2023-11-21 17:46:57 · 177 阅读 · 0 评论 -
ThreadLocaL如何防止内存泄漏
ThreadLocal 变量的内存泄漏问题主要是由于 ThreadLocalMap 中的 Entry 没有被及时清理导致的。ThreadLocalMap 是 ThreadLocal 的底层数据结构,它用于存储每个线程独立的变量副本。通过采取这些预防措施,可以有效避免 ThreadLocal 变量的内存泄漏问题,确保不再需要的对象能够被及时回收。原创 2023-11-21 17:41:46 · 188 阅读 · 0 评论 -
List操作的一些常见问题
从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。在写操作(add、remove等)时,不直接对原数据进行修改,而是先将原数据复制一份,然后在新复制的数据上执行写操作,最后将原数据引用指向新数据。这样做的好处是读操作(get、iterator等)可以不加锁,因为读取的数据始终是不变的。原创 2023-11-21 16:32:55 · 569 阅读 · 0 评论 -
创建线程的三种方式
1. 继承Thread类创建线程2. 实现Runnable接口3. 实现callable接口原创 2018-06-03 16:23:39 · 273 阅读 · 0 评论 -
Copy-On-Write写时复制机制与Java中CopyOnWriteArrayList容器源码实现
copy-on-write并发编程写时复制,解决list和set的并发读写问题 linux系统中内存的管理和分配。参考:写时复制机制 redis快照持久化(bg...原创 2018-06-03 15:16:05 · 1462 阅读 · 1 评论 -
ReentrantReadWriteLock源码解析
ReentrantReadWriteLock是ReadWriteLock的一个实现类,具有和ReentrantLock相似的语义。但注意:并不是Lock、或者ReentrantLock的子类或实现,但ReadLock和WriteLock实现了Lock接口。 ReadWriteLock源码如下:/** * A ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写...原创 2018-05-24 11:44:28 · 254 阅读 · 0 评论 -
Semaphore源码解析
Semaphore:一个计数信号量。 在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后获取它。 每个release() 释放一个许可证回去,潜在地释放一个阻塞获取方。 类似与限流算法中的令牌桶算法。 但是,Semaphore并没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。 信号量通常用于限制线程数,而不是访问...原创 2018-05-20 22:39:08 · 285 阅读 · 0 评论 -
CountDownLatch源码解析
CountDownLatch:允许一个或多个线程等待其他线程中执行完成的同步辅助工具。 CountDownLatch使用一个给定的计数初始化。await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数器无法重置。 如果您需要重置计数器的版本,可以考虑使用CyclicBar...原创 2018-05-20 21:39:22 · 227 阅读 · 0 评论 -
可重入锁ReentrantLock源码解析
ReentrantLock:一个可重入互斥Lock具有与使用synchronized方法和语句访问的隐式监视锁相同的基本行为和语义,但具有扩展功能。比如实现公平锁、超时处理、锁中断。 A ReentrantLock由最后一个成功锁定且尚未解锁的线程拥有 。当锁不是由另一个线程拥有时,调用lock的线程将成功获取锁。 如果当前线程已经拥有该锁,该方法将立即返回。 当前线程是否持有该锁可以使用...原创 2018-05-20 21:10:47 · 660 阅读 · 1 评论 -
AQS(抽象队列同步器)
一、什么是 AQS ? AQS即AbstractQueuedSynchronizer的缩写,是并发编程中实现同步器的一个框架。 AQS基于一个FIFO双向队列实现,被设计给那些依赖一个代表状态的原子int值的同步器使用。我们都知道,既然叫同步器,那个肯定有个代表同步状态(临界资源)的东西,在AQS中即为一个叫state的int值,该值通过CAS进行原子修改。 在AQS中存在一个...原创 2018-05-20 19:29:52 · 1687 阅读 · 3 评论 -
CAS:利用处理器原子性来保证juc.atomic原子性
什么是CAS: CAS,Compare and Swap即比较并交换。juc包借助CAS实现了区别与synchronized同步锁的一种乐观锁。乐观锁就是每次去修改数据的时候都乐观的认为数据不会被修改,所以不会上锁,但是在更新的时候会判断一下此期间数据有没有更新。CAS有3个操作数:内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A与内存值V相同时,将内存值V修改为B,否则什么也不...原创 2018-05-03 21:54:26 · 964 阅读 · 1 评论 -
juc的Atomic
Java从JDK1.5开始提供java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。 原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。atomic使用的是cas的更新方式,当某个线程在执行atomic的方法时,不会被其他线程打断,而别的线程就...原创 2018-05-03 21:32:37 · 612 阅读 · 0 评论 -
栅栏Java示例——CyclicBarrier
一个Barrier的小例子,栅栏数和线程池数量可以随便调整,模拟因栅栏一直等待导致的死锁。import java.util.Random;import java.util.concurrent.*;public class BarrierDemo { public static void main(String[] args) { ExecutorService ...原创 2018-04-11 19:30:27 · 1302 阅读 · 1 评论 -
java juc图谱
juc图谱: 1.collections 2.executor 3.atomic 4.locks 5.tools原创 2018-05-14 22:40:41 · 1848 阅读 · 1 评论