JUC
文章平均质量分 66
juc学习笔记
纵使相见已无言
跌跌撞撞
展开
-
JUCday10
一。CAS1.CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。” Java并发包(java.util.concurrent)中大量使用了CAS操作,涉及到并发的地方都调用了sun.m原创 2021-06-07 21:18:10 · 75 阅读 · 0 评论 -
JUCday09
一。Future接口Future模式始于JDK5,比较常见的用法就是接受线程池的submit()方法的结果: Future<String> future = executor.submit(xxx);xxx可以说就是Callable接口或者Runnable接口的实现类,提交xxx后,xxx会被包装成FutureTask类型,然后推到线程池执行run(),我们通过Future类型的对象拿到这个正在执行的异步任务,FutureTask其实也是Future接口的实现类之一,Future接口提供原创 2021-05-23 21:06:44 · 117 阅读 · 0 评论 -
JUCday08
ForkJoin当我们想执行一个数据量较大的任务时,传统的串行执行效率会极低。为了解决这个问题,jdk7出现了 forkjoin框架,基于分治算法实现,并采用工作偷窃算法加快任务的执行速度,充分利用CPU资源。框架组件1.ForkJoinTask–任务,有两种实现类:RecursiveTask–会返回任务的最终结果,RecursiveAction–不会返回任务的结果2.ForkJoinPool,任务执行的线程池,主要维护了一个工作队列数组WorkQueue[ ]3.ForkJoinWorkerTh原创 2021-05-22 20:52:34 · 99 阅读 · 0 评论 -
JUCday07
2021-5-4一、cpu密集型和IO密集型CPU密集型也是指计算密集型,大部分时间用来做计算逻辑判断等CPU动作的程序称为CPU密集型任务。该类型的任务需要进行大量的计算,主要消耗CPU资源。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。IO密集型任务指任务需要执行大量的IO操作,涉及到网络、磁盘IO操作,对CPU消耗较少。配置1.如果是io密集型的任务原创 2021-05-04 21:50:38 · 102 阅读 · 0 评论 -
JUCday06
2021-5-3一。blockingqueue.二。synchronousqueue1.SynchronousQueue是一个内部只能包含一个元素的队列。插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列中存储的元素。同样,如果线程尝试获取元素并且当前不存在任何元素,则该线程将被阻塞,直到线程将元素插入队列。2.newCachedThreadPool内部就使用了该队列,一个任务提交到该线程池后,如果没有空闲线程,就会立即创建新线程执行任务。...原创 2021-05-03 22:20:21 · 94 阅读 · 0 评论 -
JUCday05
2021-4-28。一。Semaphore。该类可以实现对资源的控制1.创建该类对象时,需要指定计数器的初始值。在该类中,计数器的初始值表示同一时间内只能有这个数量的线程操作某种资源2.内部基于aqs实现,通过cas来获取和操作aqs的同步状态–计数器的值2.acquire(),调用该方法,计数器减一,使用cas来更新计数器的值。如果调用后发现计数器减一的值<0,那么当前线程自旋尝试获取同步状态直到状态值>03.release(),调用该方法,计数器加1,使用cas来更新计数器的值。原创 2021-04-29 20:59:55 · 58 阅读 · 0 评论 -
JUCday04
2021-4-27。一。CountDownLatch1.使用该类可以让一或多个线程等待一定数量的其他线程执行完毕再继续执行。2.创建该类对象时,可以指定计数器的初始值。3.await(),一个线程调用该方法后,会陷入阻塞等待countdownlatch对象的计数器归零后,该线程再继续执行4.countDown(),调用该方法会让一个countdownlatch对象的计数器减一5.getCount(),调用该方法可以获得一个countdownlatch对象的计数器的当前值6.底层基于AQS实现,原创 2021-04-27 22:04:57 · 78 阅读 · 0 评论 -
JUCday03
2021-4-17一。8锁1.synchronized如果修饰普通方法,锁的是方法的调用者;如果修饰静态方法,锁的是方法方法所在类的class实例2.普通方法不会被synchronized方法影响,独立执行。二。线程安全的集合在多线程环境下,arraylist、set都是线程不安全的,解决办法:1.使用Collections工具类的Synchronizedxxx方法,可以把线程不安全的集合转换为线程安全的集合返回2.使用原生安全的集合,如vector、hashtable3.使用juc包的Co原创 2021-04-18 20:44:21 · 63 阅读 · 0 评论 -
JUCday02
2021-4-15。一。生产者消费者使用while在两个以上线程时,如果使用if判断是否需要wait,其他线程使用了notifyAll(),那么有一些线程可能在被唤醒后,已经不满足if条件了,此时就会出问题。但是如果使用while来判断是否需要wait,即使其他线程使用了notifyAll(),线程在被唤醒后,在执行业务代码之前,还会再检查一次判断条件,如果不满足重新wait()。二。Condition要完整的描述出Condition的应用还是要学一遍AQS,还只是粗略的看了一下书,这里就简单记录原创 2021-04-15 18:20:25 · 62 阅读 · 0 评论 -
JUCday01
2021-4-14。一.Lock接口三个实现类可重入锁ReentrantLock类、可重入写锁ReentrantLock.writeLock类、可重入读锁ReentrantLock.readLock类公平锁与非公平锁公平锁意味着多个线程时,会按尝试获取锁的线程的顺序让线程获取锁。意味着一个只需要执行3s的线程需要等前面一个需要执行3h的线程执行完毕。非公平锁意味着多个线程尝试获取锁时,由cpu决定给哪个线程获取锁,意味着执行耗时少的线程可以先执行,提高效率。ReentrantLock类与Syn原创 2021-04-14 19:04:50 · 109 阅读 · 0 评论