![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 84
zhenghehehe
这个作者很懒,什么都没留下…
展开
-
Callable&Future&FutureTask介绍
Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题 就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现 这一场景,而Future和FutureTask就可以和Callable接口配合起来使用。 Callable和Runnable的区别1 @FunctionalInterface 2 public interface ...原创 2021-12-21 14:41:42 · 517 阅读 · 0 评论 -
Fork/Join框架介绍
线程池的线程数设置多少合适? 我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资 源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应 的策略。 CPU密集型任务 CPU密集型任务也叫计算密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗 费 CPU 资源的任务。对于这样的任务最佳的线程数为 CPU 核心数的 1~2 倍,如果设置过多的 线程数,实际上并不会起到很好的效果。此时假设我们设置的线程数量是 CPU..原创 2021-12-17 15:34:56 · 435 阅读 · 0 评论 -
二叉堆在java中的的结构算法
优先级队列PriorityQueue中即使用了数组+二叉堆的数据结构实现最小堆的方法循环查找父节点做交换 直到对比不上为止入队操作private static <T> void siftUpComparable(int k, T x, Object[] array) { Comparable<? super T> key = (Comparable<? super T>) x; while (k > 0) { ...原创 2021-12-16 16:08:17 · 874 阅读 · 0 评论 -
阻塞队列BlockingQueue的各种实现
Queue接口 1 public interface Queue<E> extends Collection<E> { 2 //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常 3 boolean add(E e); 4 //添加一个元素,添加成功返回true, 如果队列满了,返回false 5 boolean offer(E e); 6 //返回并删除队首元素,队列为空则抛出异常 7 E remove();8 //返回并删除队首元素,队列原创 2021-12-15 14:55:36 · 1060 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁
读写锁介绍 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁(读 多写少)。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个 线程同时读取共享资源(读读可以并发);但是如果一个线程想去写这些共享资源,就不应该 允许其他线程对该资源进行读和写操作了(读写,写读,写写互斥)。在读多于写的情况下, 读写锁能够提供比排它锁更好的并发性和吞吐量。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,...原创 2021-12-14 15:23:51 · 595 阅读 · 1 评论 -
CyclicBarrier介绍
字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。...原创 2021-12-13 14:42:27 · 444 阅读 · 0 评论 -
CountDownLatch介绍
CountDownLatch(闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成 操作集。 CountDownLatch使用给定的计数值(count)初始化。await方法会阻塞直到当前的计数值 (count)由于countDown方法的调用达到0,count为0之后所有等待的线程都会被释放,并 且随后对await方法的调用都会立即返回。这是一个一次性现象 —— count不会被重置。如果 你需要一个重置count的版本,那么请考虑使用CyclicBarrier。原创 2021-12-10 15:28:10 · 419 阅读 · 0 评论 -
AQS之Semaphore
Semaphore介绍 Semaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于 AbstractQueuedSynchronizer实现的。 Semaphore的功能非常强大,大小为1的信号量就类似于互斥锁,通过同时只能有一个线程获 取信号量实现。大小为n(n>0)的信号量可以实现限流的功能,它可以实现只能有n个线程同 时获取信号量。 PV操作是操作系统一种实现进程互斥与同步的有效方法。PV操作与信号量(S)的处理相关,P表示通 过..原创 2021-12-10 11:37:24 · 524 阅读 · 0 评论 -
java并发之AQS详解 ReentrantLock
AQS原理分析 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队 列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于 AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实 现一个依赖状态的同步器。 JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的 一般是通过一个内部类Sync继承 AQS...原创 2021-12-09 18:21:08 · 80 阅读 · 0 评论 -
CAS和Atomic详解
什么是 CAS CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作:针对一个变量,首 先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。 CAS 的逻辑用伪代码描述如下: 1 if (value == expectedValue) { 2 value = newValue; 3 } 以上伪代码描述了一个由比较和赋值两阶段组成的复合操作,CAS 可以看作是它们合并后的整体 ——一个不可分割的原子操作,并且其原子性是直接在.原创 2021-12-06 14:56:01 · 949 阅读 · 0 评论 -
Java中的几种线程创建方式
首先在操作系统层面,宏观角度上来讲,线程的生命周期是五态1. 初始状态,指的是线程已经被创建,但是还不允许分配 CPU 执行。这个状态属于编程 语言特有的,不过这里所谓的被创建,仅仅是在编程语言层面被创建,而在操作系统层 面,真正的线程还没有创建。 2. 可运行状态,指的是线程可以分配 CPU 执行。在这种状态下,真正的操作系统线程已 经被成功创建了,所以可以分配 CPU 执行。 3. 当有空闲的 CPU 时,操作系统会将其分配给一个处于可运行状态的线程,被分配到 CPU 的原创 2021-12-03 15:20:16 · 305 阅读 · 0 评论 -
java自带线程池原理分析
newCachedThreadPool缓存线程池,可无限大CorePoolSize 核心线程 0MaximumPoolSize 最大线程 maxkeepAliveTime:60LSynchronousQueue 队列 其实只有一个在排队 一个worker进来之后从队列取出一个newFixedThreadPool这是一种固定线程数的线程池,当前线程数大于总数则会等待CorePoolSize 核心线程 10MaximumPoolSize 最大线程 10keepAliv原创 2021-12-02 15:17:40 · 323 阅读 · 0 评论