AnthonyZero's Bolg

Love Coding,Enjoy Life


  • 首页

  • 归档

  • 分类

  • 标签
AnthonyZero's Bolg

线程池:Executor框架

发表于 2019-01-15 | 分类于 Java

Alt text

Executor简介

Executor 框架结构(主要由三大部分组成)
任务:执行任务需要实现的Runnable接口或Callable接口。两者区别在于:Runnable接口不会返回结果但是Callable接口可以返回结果。

任务的执行:任务执行机制的核心接口Executor ,以及继承自Executor 接口的ExecutorService接口。ThreadPoolExecutor和ScheduledThreadPoolExecutor这两个关键类实现了ExecutorService接口。

异步计算的结果:Future接口以及Future接口的实现类FutureTask类。当我们把Runnable接口或Callable接口的实现类提交(调用submit方法)给ThreadPoolExecutor或ScheduledThreadPoolExecutor时,会返回一个FutureTask对象。

阅读全文 »
AnthonyZero's Bolg

JAVA中的线程池

发表于 2019-01-06 | 分类于 Java

Alt text

前言

在开发过程中,合理的使用线程池能够带来3个好处
第一:降低资源消耗,通过重复地利用已创建的线程降低线程创建和销毁带来的消耗
第二:提高响应速度,当任务到达时任务可以不需要等待线程创建就能立即执行
第三:提高线程的可管理性,线程是稀缺资源,应当将其放入一个池子中进行统一分配、调优和监控

实现原理

如下:ThreadPoolExecutor执行execute()方法时,线程的处理流程图

  1. 判断当前线程池线程数量是否小于核心线程池大小,是则创建线程并启动,否则到第2步
  2. 判断任务队列是否已满,未满则将任务加入阻塞队列,已满则到第3步
  3. 判断当前线程池线程数量是否小于最大线程池大小,是则创建线程并启动,否则执行饱和策略
    阅读全文 »
AnthonyZero's Bolg

JUC-Semaphore

发表于 2019-01-03 | 分类于 Java

Alt text

概念

Semaphore(信号量)用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。

Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的事情后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池。

阅读全文 »
AnthonyZero's Bolg

JUC-CyclicBarrier

发表于 2018-12-28 | 分类于 Java

前言

CyclicBarrier 是可循环使用的屏障,它要做的事情是让一组线程到达一个屏障(也可叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开;所有被屏障拦截的线程才会继续执行。

用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。

和 CountdownLatch 相似,都是通过维护计数器来实现的。使用同步屏障的线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 await() 方法而在等待的线程才能继续执行。

CyclicBarrier 和 CountdownLatch 的一个区别是,CyclicBarrier 的计数器通过调用 reset() 方法可以循环使用,所以它才叫做循环屏障。

阅读全文 »
AnthonyZero's Bolg

JUC-CountDownLatch

发表于 2018-12-27 | 分类于 Java

前言

CountdownLatch 是 JDK 并发包中提供的并发工具类,其允许一个或多个线程等待其他线程完成操作。常用作将一个任务拆分成多个子任务同时执行,只有子任务都执行完毕主线程才往下执行。

例如应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

当计数器总量大于0时,线程将被阻塞,不能够获取锁,只有当计数器总量为0时,所有被阻塞的线程同时被释放。

CountDownLatch是通过一个计数器来实现的,计数器的初始值一般为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行任务。

阅读全文 »
AnthonyZero's Bolg

JUC-Fork/Join框架

发表于 2018-12-20 | 分类于 Java

Fork/Join框架

Fork/Join框架是Java7提供的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

Oracle的官方给出的定义是:Fork/Join框架是一个实现了ExecutorService接口的多线程处理器。它可以把一个大的任务划分为若干个小的任务并发执行,充分利用可用的资源,进而提高应用的执行效率。Fork/Join的运行流程图如下:

体现出算法中分而治之思想(将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。)

阅读全文 »
AnthonyZero's Bolg

ConcurrentHashMap实现原理

发表于 2018-12-18 | 分类于 Java

简介

在并发编程中使用HashMap时可能导致程序死循环,因为HashMap并不是线程安全的。而使用线程安全的HashTable效率又非常低下,该类基本上所有的方法都采用synchronized进行线程安全的控制,可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。基于以上两个原因,便有了ConcurrentHashMap的登场机会。

HashMap线程不安全的原因

HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形链表,Entry的next节点永远不为空,就会产生死循环获取Entry.
阅读全文 »
AnthonyZero's Bolg

设计模式:模板方法模式

发表于 2018-12-04 | 分类于 设计模式

定义

使用JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写)

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意

模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果

阅读全文 »
AnthonyZero's Bolg

Java并发-重入锁ReentrantLock

发表于 2018-12-02 | 分类于 Java

概述

重入锁ReentrantLock,顾名思义就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。(即当前线程再次获取该锁不会被阻塞)

Java关键字synchronized隐式支持重入性,实现的原理是通过编译后加上不同的机器指令来实现。而 ReentrantLock 就是一个普通的类,它是基于 AQS(AbstractQueuedSynchronizer)来实现的

synchronized 依赖于 JVM 而 ReenTrantLock 依赖于 API

阅读全文 »
AnthonyZero's Bolg

Java并发-初识AQS

发表于 2018-12-01 | 分类于 Java

概念

AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,它是用来构建锁或者其他同步组件的基础框架,它维护了一个volatile int state来表示同步状态,通过内置的FIFO队列来完成线程等待排队。仅仅是定义了若干同步状态获取和释放,线程排队,等待与唤醒等底层操作的方法来供自定义同步组件使用或者重写。

AQS的设计是基于模板方法设计的,可供实现的模板方法基本上可以分为三类:独占式获取与释放同步状态、共享式获取与释放同步状态和查询同步队列中的等待线程情况。

子类通常被推荐定义为自定义同步组件的静态内部类,子类通过继承AQS并实现它的抽象模板方法来管理同步状态,而这些模板方法内部就是真正管理同步状态的地方(主要有tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared等)。

ReentrantLock、ReentrantReadWriteLock、Semaphore等同步组件都是基于AQS构建

阅读全文 »
1…456…8
Pingjin

Pingjin

Java/GoLang攻城狮

76 日志
17 分类
93 标签
GitHub Twitter Weibo 倔金
© 2017 - 2022 Pingjin
本站访客数:
主题 - NexT.Pisces