多线程
文章平均质量分 94
尚凯辉的博客
坚持终身学习!
展开
-
AQS原理详解
文章目录定义原理加锁流程解锁流程流程图ReentrankLock原理加锁代码lockacquiretryAcquireaddWaiteracquireQueuedshouldParkAfterFailedAcquire释放锁代码release定义AQS:抽象队列同步器AQS是用来构建锁或者其他同步器组件的基础框架,是整个JUC体系的基石。AQS使用一个volatile修饰的int类型的成员变量state表示同步状态(0表示无锁,大于0表示持有锁),和一个先进先出的双向链表队列来完成阻塞线程的排队工作原创 2021-06-15 22:41:30 · 311 阅读 · 0 评论 -
CompletionService学习总结
文章目录CompletionService简介应用场景常用方法应用案例:查询3个网站,汇总结果CompletionService简介CompletionService将Executor和BlockingQueue的功能融合在一起,将Callable任务提交给CompletionService来执行,然后使用类似于队列操作的take和poll等方法来获得已完成的结果,而这些结果会在完成时被封装为Future。CompletionService实现了生产者提交任务和消费者获取结果的解耦,生产者和消费者都不原创 2020-08-13 10:35:41 · 433 阅读 · 0 评论 -
多线程-常见方法详解
文章目录sleep方法:让线程睡眠yield方法:让出CPU执行权join方法:等待线程执行终止wait, notify, notifyAll:线程的通知与等待注意事项虚假唤醒wait只释放当前共享变量上的锁为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用wait()方法和notify()/notifyAll()方法在放弃对象监视器时有什么区别为什么这些操作线...原创 2020-02-05 23:22:08 · 322 阅读 · 0 评论 -
Java多线程-并发工具类Semaphore详解
文章目录简介应用场景例子注意事项原理初始化方法void acquire()方法void acquire(int permits)方法void acquireUninterruptibly()方法void release()方法void release(int permits)方法简介Semaphore是一种同步辅助工具,翻译过来就是信号量,用来实现流量控制,它可以控制同一时间内对资源的访问次数...原创 2020-01-16 20:23:55 · 381 阅读 · 0 评论 -
多线程-并发工具类之CyclicBarrier详解
文章目录简介例子实现原理小结简介从字面意思理解,CyclicBarrier是回环屏障的意思,它可以让一组线程全部达到一个状态后再全部同时执行。这里之所以叫作回环是因为当所有等待线程执行完毕,并重置CyclicBarrier 的状态后它可以被重用。之所以叫作屏障是因为线程调用await 方法后就会被阻塞,这个阻塞点就称为屏障点,等所有线程都调用了await方法后,线程们就会冲破屏障,继续向下运行...原创 2020-01-15 19:57:10 · 471 阅读 · 0 评论 -
多线程-并发工具类之CountDownLatch详解
文章目录简介应用场景例子CountDownLatch与join方法的区别CountDownLatch实现原理构造函数void await()方法boolean await(long timeout, TimeUnit unit)方法void countDown()方法long getCount()方法小结简介在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有...原创 2020-01-15 14:53:52 · 842 阅读 · 0 评论 -
Java多线程-常见锁的概述
文章目录悲观锁和乐观锁简介乐观锁和悲观锁的优缺点和适用场景总结公平锁和非公平锁可重入锁和不可重入锁定义原理自旋锁独占锁和共享锁悲观锁和乐观锁简介乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。悲观锁,在操作数据时比较悲观,认为别人会同时修改数据。所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。乐观锁,就是思想很乐观,它认为数据在一般情况下不会造成冲突...原创 2020-01-10 10:55:09 · 129 阅读 · 0 评论 -
Java多线程-ThreadLocal详解
文章目录简介例子实现原理常用方法详解set方法get方法remove方法ThreadLocal的作用注意事项总结简介ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLoc...原创 2020-01-09 16:21:03 · 307 阅读 · 0 评论 -
Java多线程-死锁,活锁,饥饿详解
文章目录什么是死锁?产生死锁的必要条件如何避免和处理死锁?死锁的例子什么是活锁什么是线程饥饿什么是无锁什么是死锁?定义:如果两个或者更多的线程因相互等待对方而被永远暂停(线程的生命周期状态为BLOCKED或者WAITING),那么我们就称这些线程产生了死锁.由于产生死锁的线程的生命周期状态永远是非运行状态,因此这些线程索要执行的任务也永远无法进展.通俗的说:当线程A持有独占锁a,并尝试去获...原创 2020-01-08 18:42:29 · 661 阅读 · 0 评论 -
Java多线程之线程池面试常见问题
文章目录为什么要使用线程池线程池的工作原理常用的线程池类线程池的核心参数线程池的拒绝策略线程池中的常用任务队列如何终止线程池高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?执行execute()方法和submit()方法的区别是什么呢?如果你提交任务时,线程池队列已满,这时会发生什么线程池使用注意事项为什么要使...原创 2020-01-07 16:04:21 · 1711 阅读 · 1 评论