JUC 并发多线程
文章平均质量分 93
呵呵呵1112
这个作者很懒,什么都没留下…
展开
-
JUC-1.0-线程池-介绍
述在日常开发中,当我们需要使用多线程来处理一些任务的时候,可以创建一个线程,然后去调用 start() 启动,这种方式比较简单,但是同时也带来一些问题,比如在任务数量多的情况下,频繁的创建销毁线程,就会给服务器带来较大的压力,处理效率也不是特别高, 所以在这种情况下,我们就可以使用线程池来处理这些任务,创建固定数量的线程去处理任务,避免一直创建和销毁线程带来的开销. 下面就对线程池做一些详细的了...原创 2020-04-18 17:43:06 · 150 阅读 · 0 评论 -
JUC-1.1-线程池-创建及使用
述上文中对线程池做了一个基本的了解,说了这么多,如何去创建一个线程池呢? JUC 包里面给我们提供了一个工具类就是 java.util.concurrent.Executors ,通过这个类我们就可以创建几种不同类型的线程池,来看一下这个类中常用的几个方法固定数量线程池通过 Executors.newFixedThreadPool() 这个方法创建,代码如下:@Slf4jpublic c...原创 2020-04-18 17:45:39 · 644 阅读 · 0 评论 -
JUC-1.2-线程池-钩子方法的使用
述上文提到了线程池的钩子方法,其实就是线程池在执行每个任务的前后执行一些操作,还有线程池的暂停与继续,等等一些辅助功能,下面看一下如何使用钩子方法的使用ThreadPoolExecutor 提供了3个钩子方法,需要子类去根据自己的需要重写,三个方法如下:protected void beforeExecute(Thread t, Runnable r) { } // 任务执行前prote...原创 2020-04-18 17:46:33 · 221 阅读 · 0 评论 -
JUC-2.0-ThreadLocal-基本使用
述了解了线程池之后,再来看一个常用的类,就是 ThreadLocal 这个类在面试中也是很常见的,下面来看一下这个类常见的使用场景常见使用场景ThreadLocal 比较常见的有两个地方每个线程都需要一个独享的对象,通常是工具类,比如经常用的 SimpleDateFormat 和 Random ,这两个类都不是线程安全的类,使用 ThreadLocal 就可以保证线程安全每个线程内需要...原创 2020-04-18 17:47:53 · 154 阅读 · 0 评论 -
JUC-2.1-ThreadLocal-原理解析
述上文中了解了 ThreadLocal 的常用场景和最基本的用法之后再来看一下它的原理以及一些要注意的事项Thread,ThreadLocal,ThreadLocalMap首先需要了解一下 Thread ,ThreadLocal ,ThreadLocalMap 这三个类之间的关系,如图就是一个线程 (Thread) 对应有一个 ThreadLocalMap , ThreadLocalMa...原创 2020-04-18 17:51:04 · 192 阅读 · 0 评论 -
JUC-3.0-锁-Lock的基本使用
述在并发开发中,锁也是经常使用的一个工具,主要是用于对并发资源的访问,常用的锁就是 Lock 和 synchronized ,这两个锁都可以达到线程安全的目的,但是在使用上有较大差别.Lock 和 synchronizedLock 一般情况用于 synchronized 不满足要求或者不合适的时候, Lock 是一个接口,最常用的实现类就是 ReentrantLock ,一般情况下 Lock...原创 2020-04-18 17:52:00 · 214 阅读 · 0 评论 -
JUC-3.1-锁-锁的分类
述Java 锁有很多种,从不通的角度来看,锁大概有以下几种分类下面分别看一下这几种锁悲观锁和乐观锁简单来说,悲观锁就是面对同步资源的时候,首先认为会有别的线程会来修改数据,所以先上锁,锁住之后再去修改资源,上面提到的 synchronized 和 Lock 就都是悲观锁乐观锁就是先认为没有线程去修改这个资源,所以不上锁先去修改,等修改完成提交的时候再做检查,如果这个时间段有别的线程修改...原创 2020-04-18 17:52:40 · 365 阅读 · 0 评论 -
JUC-4.0-原子类-介绍及基本使用
述在并发编程中,原子类也是经常使用的一个工具,利用原子类,可以把一些操作变成一个原子操作,在多线程的情况下不需要加锁也可以保证线程安全原子类的作用及优势原子类的作用跟锁是类似的,都是为了保证在并发环境下的线程安全,原子类相比于锁,有一定的优势锁的粒度更细: 原子类可以把竞争范围缩小到变量级别,通常我们手动加锁的粒度都会大于原子变量的粒度效率更高: 一般情况下,原子类的效率会比使用锁的效............原创 2020-04-18 17:54:18 · 569 阅读 · 0 评论 -
JUC-5.0-CAS-核心概念
述上文中介绍了原子类,在原子类中有一个常用的方法就是 compareAndSet() 这个方法,这个方法其实就是一个 CAS 方法, CAS(Compare-and-Swap) 字面意思比较并替换,是一种实现并发算法时常用的技术CASCAS有三个操作数: 内存值V,预期值A,要修改的值B,当切仅当预期值A和内存值相同的时候,才将内存值修改为B通俗点来说,就是我认为V的值应该是A,如果真的是...原创 2020-04-18 17:55:04 · 207 阅读 · 1 评论 -
JUC-6.0-并发容器-HashMap
述并发编程中,并发容器也是非常重要的一个工具,我们平时用的 ArrayList, HashMap 等等这些集合类都不是线程安全的,在并发环境下就可能会出现问题,JDK给我们提供了一些线程安全的容器,供我们使用过时的并发容器在早期的版本中, Hashtable 和 Vector 就对应的是线程安全的 HashMap 和 ArrayList这两个线程安全类,本质上就是给方法加上 synchro......原创 2020-04-19 15:13:51 · 161 阅读 · 0 评论 -
JUC-6.1-并发容器-ConcurrentHashMap
述上文中分析了JDK1.7和1.8中的 HashMap 的数据结构以及一些重要的方法,本文同样从这两个版本,分析一下 ConcurrentHashMapJDK1.7 中的 ConcurrentHashMap数据结构如图Java 7 中的 ConcurrentHashMap 最外层是多个 segment, 每个 segment 的底层数据结构和 HashMap 类似的,仍然是数组和链表结...原创 2020-04-18 17:56:11 · 122 阅读 · 0 评论 -
JUC-6.2-并发容器-CopyOnWriteArrayList
述了解了并发安全的 HashMap 之后,再来看看并发安全的 ArrayList ,就是 CopyOnWriteArrayList, 早期的版本中有 Vector 和 SynchronizedList 但是这两个锁的粒度太大,所以并发效率并不高, Copy-On-Write 并发容器还包括 CopyOnWriteArraySet 用来替代同步 Set适用场景CopyOnWriteArrayL...原创 2020-04-18 17:57:16 · 157 阅读 · 0 评论 -
JUC-6.3-并发容器-队列
述除了集合,还有一种数据结构就是队列,前面在学习线程池的时候已经接触过了,用队列可以在线程之间传递数据,最常见的就是生产者和消费者模式,队列又分为阻塞队列和非阻塞队列阻塞队列和非阻塞队列队列是一个逻辑结构,对应的物理结构可能是由数组或链表实现的那么阻塞队列和非阻塞队列有什么区别举个例子,现在有一个队列,长度是10,现在已经满了,当第11个数据放进去的时候,阻塞队列可以设置一个超时时间,...原创 2020-04-18 17:58:34 · 168 阅读 · 0 评论 -
JUC-7.0-线程协作-CountDownLatch
述线程的运行和运行时机是不受我们自己控制的,一些情况下我们可能需要多个线程之间配合来完成一些任务,比如线程A等B线程执行完成之后运行等CountDownLatchCountDownLatch 是一个线程协作的工具类,是一个计数器,主要用到的有以下几个方法:构造方法,参数是 count ,是需要倒数的值await(): 调用 await() 方法的线程会被挂起,等到 count 为 0 ...原创 2020-04-18 17:59:07 · 290 阅读 · 0 评论 -
JUC-7.1-线程协作-Semaphore
述Semaphore 信号量,也是一个线程协作的工具,可以用来限制或管理数量有限的资源的使用用法信号量的作用是维护一个 “许可证” 的计数,线程可以获取许可证,然后信号量剩余许可证数量减一,当信号量所拥有的许可证为0的时候,下一个想要获取许可证的线程就需要等待,直到有另外的线程释放了许可证常用的几个方法如下构造函数: 和上文的 CountDownLatch 一样, Semaphore...原创 2020-04-22 22:23:20 · 145 阅读 · 0 评论 -
JUC-7.3-线程协作-CyclicBarrier
述CyclicBarrier 循环栅栏同样是一个线程协作工具,和 CountDownLatch 很像,都能阻塞一组线程作用当有大量线程相互配合,分别计算不同任务,并且需要最后统一汇总的时候,我们可以使用 CyclicBarrier,CyclicBarrier 可以构造一个集结点,当某一个线程执行完毕,它就会到集结点等待,直到所有线程都到了集结点,那么该栅栏就被撤销,所有线程再统一出发,继续执...原创 2020-04-19 15:14:00 · 181 阅读 · 0 评论 -
JUC-7.2-线程协作-Condition
述在线程运行过程中,需要等待某个条件的时候,就可以用 Condition ,调用它的 await() 方法,进入阻塞状态等待,当另一个线程去执行对应的条件,直到这个条件达成的时候就去执行它的 signal() 方法,这时候JVM会从被阻塞的线程中找等待该条件的线程,然后唤醒,继续执行常用方法await(): 调用后进入阻塞状态signalAll(): 唤起全部的正在等待的线程signa...原创 2020-04-19 15:14:07 · 135 阅读 · 0 评论 -
JUC-8.0-Future和Callable
Runnable的缺陷不能返回一个返回值不能抛出 checked ExceptionCallable接口类似于Runnable,被其他线程执行的任务实现Call方法有返回值Future可以用Future.get来获取Callable接口返回的执行结果。相当于一个存储器,它存储了call()这个任务的结果,而这个任务的执行时间是无法提前确定的。在call()未执行完之前调用get()...原创 2020-05-07 22:13:12 · 126 阅读 · 0 评论