![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程的艺术
文章平均质量分 87
《java并发编程的艺术》
Java并发编程的框架、原理和核心技术
贾欣晓
终身学习,共同成长。
展开
-
Condition接口详解
任意一个java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者再使用方式以及功能特性上还是有差别的。原创 2022-08-24 23:22:37 · 217 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁实现原理详解
读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大的提升。除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共享的用作缓存数据结构,它大部分时间提供读服务(例如查询和搜索),而写操作占有的时间很少,但是写操作完成之后的更新需要对后续的读服务可见。.........转载 2022-08-14 23:17:03 · 1046 阅读 · 0 评论 -
重入锁ReentrantLock详解
重入锁ReentrantLock,顾名思义,就是支持重进入的锁,。除此之外,该锁的还支持获取锁时的公平和非公平性选择。在AQS实现中,当一个线程调用Mutex的lock()方法获取锁之后,如果再次调用lock()方法,则该线程将会被自己所阻塞,原因是Mutex在实现tryAcquire(int acquires)方法时没有考虑占有锁的线程再次获取锁的场景,。简单的说,Mutex是一个不支持重进入的锁。......原创 2022-08-07 15:24:17 · 1238 阅读 · 0 评论 -
AQS实战-自定义同步组件TwinsLock
TwinsLock在同一时刻允许至多两个线程的同时访问,表明同步资源数为2,这样可以设置初始状态status为2,当一个线程进行获取,status减1,该线程释放,则status加1,状态的合法范围为0、1和2,其中0表示当前已经有两个线程获取了同步资源,此时再有其他线程对同步状态进行获取,该线程只能被阻塞。在同步状态变更时,需要使用compareAndSet(int expect,int update)方法做原子性保障。自定义同步组件通过组合自定义同步器来完成同步功能,...原创 2022-08-07 12:09:03 · 306 阅读 · 0 评论 -
Lock接口的自定义实现-队列同步器AQS详解
队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者期望它能够成为实现大部分同步需求的基础。...............原创 2022-07-30 23:10:28 · 169 阅读 · 0 评论 -
Lock接口详解
例如,针对一个场景,手把手进行锁获取和释放,先获得锁A,然后再获得锁B,当锁B获得后,释放锁A同时获取锁C,当锁C获得后,再释放B同时获取锁D,以此类推。在Lock接口出现之前,java程序是靠synchronized关键字实现锁功能的,而javaSE5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。...原创 2022-07-27 22:43:13 · 289 阅读 · 0 评论 -
FutureTask对象详解
FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Excutor执行,也可以由调用线程直接执行(FutureTask.run())。根据FutureTask.run()方法被执行的时机,FutureTask可以处于下面3种状态。未启动。FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态。当创建一个FutureTask,且没有执行FutureTask.run()方法之前,这个FutureTask处于未启动状态。原创 2022-07-23 16:06:38 · 1035 阅读 · 0 评论 -
ScheduledThreadPoolExecutor详解
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。原创 2022-07-17 23:36:32 · 771 阅读 · 1 评论 -
ThreadPoolExecutor对象详解
Executor框架最核心的类时ThreadPoolExecutor,它是线程池的实现类,主要由下列4个组件构成。FixedThreadPool被称为可重用固定线程数的线程池。下面为FixedThreadPool的源代码实现。FixedThreadPool的corePoolSize和maximumPoolSize都被设置为创建FixedThreadPool时指定的参数nThreads。当线程池种的线程数大于corePoolSize时,keepAliveTime为多余的空闲线程等待新任务的最长时间,超过这个原创 2022-07-06 23:21:30 · 256 阅读 · 0 评论 -
Executor框架详解
java的线程既是工作单元,也是执行机制。从jdk5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。在HotSpot VM的线程模型中,java线程被一对一映射为本地操作系统线程。java线程启动时会创建一个本地操作系统线程;当该java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。在上层,java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务原创 2022-07-03 23:23:25 · 911 阅读 · 0 评论 -
线程池的实现原理与使用详解
几乎所有需要异步或并发执行任务的程序都可以使用线程池,在开发过程中,合理地使用线程池能够带来3个好处。当向线程池提交一个任务之后,线程池是如何处理这个任务的呢?我们来看一下线程池的主要处理流程:ThreadPoolExecutor执行execute方法分下面4种情况:源码分析:工作线程:线程池创建线程时,会将线程封装成工作线程Worker,Worker在执行完任务后,还会循环获取工作队列里的任务来执行。我们可以从Worker类的run()方法里看到这点:线程池中的线程执行任务分两种情况:我们可以通过T原创 2022-06-29 23:46:01 · 367 阅读 · 0 评论