Java多线程
Multithreading makes your application run faster but also unsafer
Alphathur
码路漫漫修远兮,吾将原创而求索。
展开
-
Semaphore vs Mutex
Semaphore 信号灯,用来控制同时并发的线程数量Mutex 互斥锁,控制同一时刻只能有一个线程执行二者最重要的区别在于所有权这个概念,Mutex 具有所有权,它本身是一个互斥锁,在一个时刻只能被一个线程持有,但是Semaphore没有所有权,任何线程都可以调用此对象的方法。......原创 2022-07-01 13:58:35 · 421 阅读 · 0 评论 -
CountDownLatch vs CyclicBarrier
CountDownLatch:计数器,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成,CountDownLatch是减计数,计数减到0后不能重置。CyclicBarrier:循环屏障,它允许一组线程相互等待以达到一个共同的屏障点。CyclicBarrier是加计数,计数加到目标值后可以重置。......原创 2022-07-01 11:00:31 · 368 阅读 · 0 评论 -
Java模拟ReentrantLock实现自己的显示锁BooleanLock
一、前言Java通过synchronized关键字来为我们提供线程安全的保证,大多数情况下使用synchronized是没有问题的,然而synchronized有自身的缺陷。例如:当其它线程持有锁时,当前请求获取锁的线程必须等待。等待的时长是无法控制的,而且等待过程中无法响应中断。正是为了解决synchronized这些的缺陷,Java提供了一个显示锁ReentrantLock来实现线程安...原创 2018-10-23 13:20:22 · 10920 阅读 · 0 评论 -
Java等待线程池终止
1、轮询isTerminated: while (!service.isTerminated()) { TimeUnit.SECONDS.sleep(1); }2、轮询awaitTermination: while (!service.awaitTermination(1, TimeUnit.SECONDS)) {...原创 2018-08-21 00:22:42 · 12654 阅读 · 0 评论 -
execute和submit的区别与联系
execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务,而submit既能提交Runnable类型任务也能提交Callable类型任务。execute会直接抛出任务执行时的异常,submit会吃掉异常,可通过Future的get方法将任务执行时的异常重新抛出。execute所属顶层接口是Executor,submit所属顶层接口是ExecutorS...原创 2018-08-21 00:23:15 · 20499 阅读 · 0 评论 -
Runnable和Callable的区别和联系
Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的。1)Runnable提供run方法,无法通过throws抛出异常,所有CheckedException必须在run方法内部处理。Callable提供call方法,直接抛出Exception异常。2)Runnable的run方法无返回值,Callable的call方法...原创 2018-08-20 22:37:30 · 35254 阅读 · 9 评论 -
Java正确地终止线程
首先要明确的是Java没有提供任何机制来安全的终止线程。Java虽然提供了stop方法来终止线程,但是这种方式简单粗暴,很可能造成数据不一致的情况,因此stop方法已经弃用了。目前较为安全地终止线程方式有两种:1)使用标志位,让线程run方法在合适的时候结束执行,从而终止线程。2)使用中断机制,让线程run方法在中断的状态下结束执行,从而终止线程。ps:这两种方案虽然都可以安全...原创 2018-08-18 23:16:05 · 10760 阅读 · 0 评论 -
了解循环屏障CyclicBarrier
CyclicBarrier是常用的同步辅助工具类,它的作用是让一组线程达到屏障点时被阻塞,直到指定数量的线程都达到屏障点,才取消阻塞,此时被阻塞的线程才能继续执行。循环屏障可以重复使用。SyclicBarrier构造方法有两个CyclicBarrier(int parties)和CyclicBarrier(int parties, Runnable barrierAction)。第一个参数pa...原创 2018-08-08 22:49:14 · 10875 阅读 · 0 评论 -
了解信号量Semaphore和线程池的差异
一、首先要明白Semaphore和线程池各自是干什么?信号量Semaphore是一个并发工具类,用来控制可同时并发的线程数,其内部维护了一组虚拟许可,通过构造器指定许可的数量,每次线程执行操作时先通过acquire方法获得许可,执行完毕再通过release方法释放许可。如果无可用许可,那么acquire方法将一直阻塞,直到其它线程释放许可。线程池用来控制实际工作的线程数量,通过线程复用的方...原创 2018-08-08 00:51:36 · 17147 阅读 · 4 评论 -
了解join()和CountDownLatch的差异
一、join()join()是线程对象的成员方法,功能是等待调用join()的线程对象执行完毕,才执行其它的逻辑。假设我们有三个线程, 主线程,子线程B和C。在主线程中若调用了子线程的join方法,则必须等待子线程执行完毕,才会继续执行主线程的其它逻辑。如下是案例:public class JoinTest { public static void main(String []...原创 2018-07-29 22:49:20 · 11153 阅读 · 2 评论 -
非线程安全的ListHelper
Java并发编程实战这本书里提到了使用Collections.synchronizedList可以创建线程安全的容器,同时给了一个没有正确使用该容器的反例ListHelper,这个反例看起来实现了同步,然而由于锁不一致导致它并不是一个线程安全的类。代码如下:class ListHelper <E> { public List<E> list = Collect...原创 2018-07-29 22:33:17 · 11184 阅读 · 0 评论