JUC并发
魔舞清华-方
这个作者很懒,什么都没留下…
展开
-
CompletableFuture 异步编排
CompletableFuture 是jdk1.8 才提供的,可以返回异步执行任务的返回值使用CompletableFuture场景CompletableFuture 创建异步对象代码示例:没有返回值:有返回值:CompletableFuture 计算完成时回调handle 方法代码示例:运行结果:线程串行化方法代码示例:任务一 执行完后,接着执行任务二,没有返回结果thenRunxx不能获取到上一步的执行结果运行结果:代码示例2:运行结果:代码原创 2020-05-27 10:53:42 · 293 阅读 · 0 评论 -
线程死锁及其定位分析
死锁概述线程死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于synchronized的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死等下去,因此这便造成了死锁。死锁产生的条件互斥条件:一个资源,或者说一个锁只能被一个线程所占用,当一个线程首先获取到这个锁之后,在该线程释放这个锁之前,其它线程均是无法获取到这个锁的。...原创 2020-03-27 11:39:19 · 799 阅读 · 0 评论 -
深入理解java线程池
线程池的优势降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。提供更强大的功能,延时...原创 2020-03-27 10:51:01 · 257 阅读 · 0 评论 -
Callable接口实现多线程的方式
通过Callable接口实现多线程实现Callable重写call方法实现Callable和实现Runnable类似,但是功能更强大,具体表现在可以在任务结束后提供一个返回值,Runnable不行call方法可以抛出异常,Runnable的run方法不行可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用...原创 2020-03-26 10:52:08 · 1958 阅读 · 0 评论 -
condition使用及分析
基本介绍Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。Cond...原创 2020-03-26 09:07:03 · 781 阅读 · 0 评论 -
synchronized和lock的区别
synchronized和lock的区别Lock是java的一个interface接口,而synchronized是Java中的关键字,synchronized是由JDK实现的,不需要程序员编写代码去控制加锁和释放;Lock的接口如下:ublic interface Lock { void lock(); void lockInterruptibly() throws In...原创 2020-03-25 20:59:18 · 339 阅读 · 0 评论 -
生产者与消费者
基本介绍生产者-消费者模式是一个十分经典的多线程并发协作的模式:所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。对于此模型,应该明确一下...原创 2020-03-25 20:03:24 · 689 阅读 · 0 评论 -
java阻塞队列详解
基本介绍:队列是一种数据结构,它有两个基本操作:在队列尾部加入元素和从队列头部移除元素。在我们日常开发中,经常用来并发操作数据。java包中有一些应用比较广泛的特殊队列:一种是以ConcurrentLinkedQueue为代表的非阻塞队列;另一种是以BlockingQueue接口为代表的阻塞队列。通过这两种队列,我们保证了多线程操作数据的安全性。队列的继承图:从类图中可以得知:j...原创 2020-03-25 17:51:07 · 397 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore详解
CountDownLatchCountDownLatch概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表...原创 2020-03-25 13:11:17 · 1556 阅读 · 0 评论 -
读写锁(ReentranReadWriteLock))详解
基本介绍ReadWriteLock同Lock一样也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁。ReentranReadWriteLock是其实现类读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的(排他的)。 每次只能有一个写线程,但是可以有多个线程并发地读数据。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话...原创 2020-03-25 10:22:27 · 8698 阅读 · 1 评论 -
java锁值自旋锁
自旋锁(spinlock)自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少上下文切换的消耗,缺点是循环会消耗CPU即:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环在CAS中的Unsafe类中就要自旋锁的应用,如下源码:该循环会一直去尝试获得它的期望值,然...原创 2020-03-25 09:03:12 · 130 阅读 · 0 评论 -
java可重入锁
可重入锁指的是在一个线程中可以多次获取同一把锁比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁;在java中ReentrantLock和synchronized都是可重入锁代码示例/** * 可重入锁 */public class Reentrant { Lock lock = new Reentra...原创 2020-03-25 08:01:58 · 494 阅读 · 0 评论 -
java公平锁与非公平锁
公平锁与非公平锁公平锁:表示线程获取锁的顺序是按照加锁的顺序来分配的,及先来先得,先进先出的顺序。非公平锁:表示获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定能拿到锁,Lock锁分为公平锁和非公平锁,synchronized是非公平锁公平锁案例...原创 2020-03-24 18:43:45 · 224 阅读 · 0 评论 -
CAS(Compare-and-Swap)详解
CAS概述CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题。volatile不保证原子性问题根据我前面volatile文章,volatile并不能保证原子性操作,在并发情况下对i++操作,volatile也会发生丢数据的情况,主要是因为线程在对各自的工作非常对数据进行修改后,...原创 2020-03-17 20:42:29 · 1788 阅读 · 1 评论 -
java内存模型(JMM)与 volatile关键字
JMM基本介绍MM(java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不是真实的存在,它描述的是一组规则或者规范,通过这组规范定义了程序的各个变量(包括实例字段,静态字段和构成构成数组对象的元素)的访问方式JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存...原创 2020-03-17 09:11:47 · 402 阅读 · 0 评论