![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程学习
竹下星空
这个作者很懒,什么都没留下…
展开
-
volatile底层原理图解
cpu层面上可见性和指令重排的由来Java可见性和指令重排的由来原创 2020-08-21 11:22:48 · 265 阅读 · 0 评论 -
synchronized底层原理
1.synchronized实现原理synchronized借助对象的monitor来实现,每个对象都有monitor,monitor有_owner,_count,_entryList,_waitSet等属性,当一个线程访问synchronized修饰的代码块或方法时,首先会检查_owner是否指向线程,如果指向线程则判断是否是一个线程,是则获取锁,_count+1,不是则进入_entryList等待持有线程释放锁,_waitSet是在持有锁的线程调用了wait方法时进入等待的集合。2.编译器是如何知原创 2020-08-20 12:03:06 · 484 阅读 · 0 评论 -
CountDownLatch的工作流程
CountDownLatch的工作流程:1.通过CountDownLatch(int count)构造器给sync同步器的state赋值。2.每调countDown一次state数值-1,直到state为0时唤醒等待队列中head后的第一个线程。3.没调await方法一次都会去判断state是不是为0,当为0时直接执行,不为0时排队等待,直到被park唤醒。问题一:为什么使用共享锁而不用独占锁?独占锁只有在释放资源时才会唤醒head节点的下一个node,如果使用独占锁调用await方法的线程只会原创 2020-08-15 17:26:55 · 183 阅读 · 0 评论 -
ReentrantLock的公平锁和非公平锁实现图解
公平锁的获取和释放:可以看到这个过程跟AQS独占锁的获取和释放是一样的,实现公平锁的关键是tryRelease方法的实现:公平锁实现关键:当有资源时也会判断当前有没有线程在等待,只要有线程在等待不管有没有资源都要排队等待,这就保证了线程完全是按先后顺序执行。可重入实现细节:同一个线程可以在没有资源情况下无限次获取锁,通过上图可以看到,在state不是0的情况下会判断当前线程是否是持锁线程,是的情况下会改变state的值并return true。此时要注意,同一个线程lock几次,也要unloc原创 2020-08-15 15:47:53 · 713 阅读 · 0 评论 -
AQS图解
1.独占锁1.1独占锁的获取和释放1.2 addWaiter方法:1.3 acquireQueued方法注意:线程挂起之后就不自旋了,等待有线程调用unpark之后才会继续执行。1.4 release方法注意:这里调用unpark之后被唤醒的线程继续自旋开始竞争锁,如果还是没有竞争到会再次进入park睡眠状态。2.共享锁2.1共享锁的获取和释放1.如何进行唤醒线程?唤醒线程都是在解锁时唤醒,当竞争锁的线程没有获取到资源时,都会进行park,当有线程调用了unlock方法之后,原创 2020-08-14 16:55:18 · 402 阅读 · 0 评论 -
多线程学习笔记十六——java中的线程池
使用线程池的好处:第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用 线程池,必须对其实现原理了如指掌。线程池实现...原创 2018-09-13 14:03:40 · 178 阅读 · 0 评论 -
多线程学习笔记十七——Executor框架
1)FixedThreadPoolpublic static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISE...原创 2018-09-13 14:31:30 · 121 阅读 · 0 评论 -
多线程学习笔记一 ——为什么使用多线程
(1)更多的处理器核心 随着处理器上的核心数量越来越多,以及超线程技术的广泛运用,现在大多数计算机都 比以往更加擅长并行计算,而处理器性能的提升方式,也从更高的主频向更多的核心发展。如 何利用好处理器上的多个核心也成了现在的主要问题。 线程是大多数操作系统调度的基本单元,一个程序作为一个进程来运行,程序运行过程 中能够创建多个线程,而一个线程在一个时刻只能运行在一个处理器核心上。试想一下...原创 2018-09-11 10:56:06 · 166 阅读 · 0 评论 -
学习多线程笔记二——使用多线程所面临的的问题及解决方法
上下文切换问题:多线程在执行时cpu会给线程分配时间片,一段时间片的完成会执行下一个任务,此时需要保存此任务的状态以便下次切换回来的时候执行,从保存状态到再执行就是一次上下文的切换 如何解决:无锁并发编程(分段锁),cas算法,使用最少线程线程创建问题:线程创建需要消耗时间和性能,使用多线程时要平衡线程创建和上下文切换的耗时和并发带来的任务时间的缩短带来的性能提高,所以使用多线程并不一定带来...原创 2018-09-11 11:04:22 · 327 阅读 · 0 评论 -
多线程学习笔记之十四——CountDownLatch、 CyclicBarrie、Semaphore的使用
CountDownLatchCountDownLatch的构造器:public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }count参...原创 2018-09-13 13:32:05 · 167 阅读 · 0 评论 -
多线程学习笔记十三——java中的原子操作类
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因 为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使 用synchronized来解决这个问题,synchronized会保证多线程不会同时更新变量i。 而J...原创 2018-09-12 11:35:30 · 150 阅读 · 0 评论 -
多线程学习笔记十二——Fork/Join框架的使用
案例场景:把pdf转成图片,客户上传pdf,然后用图片再展示给客户,因为pdf展示过大过慢,所以提高pdf转图片的快慢会严重影响到请求相应的速度,此案例使用了俩页pdf为任务的最小单元,具体代码如下:package com.zqsign.file.external.utils;import java.awt.image.BufferedImage;import java.io.Byt...原创 2018-09-12 11:23:00 · 326 阅读 · 0 评论 -
多线程学习笔记四——wait,notify机制
package day1;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.TimeUnit;public class WaitNotify { static boolean flag = true; static Object lock = new O...原创 2018-09-11 14:09:52 · 176 阅读 · 0 评论 -
多线程学习笔记五——join机制
package day1;import java.util.concurrent.TimeUnit;public class Join { public static void main(String[] args) throws Exception { Thread previous = Thread.currentThread(); for (i...原创 2018-09-11 14:18:47 · 121 阅读 · 0 评论 -
多线程学习六——ThreadLocal的使用
package day1;import java.util.HashMap;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.TimeUnit;public class ThreadLocalT...原创 2018-09-11 15:15:23 · 196 阅读 · 0 评论 -
多线程学习七——实现独占锁
独占锁:有且只有一个线程能持有该锁,而且获得锁的线程也只能获得一次,不能获得多次package day1;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import java.util.concurrent.locks.Conditi...原创 2018-09-11 16:30:33 · 308 阅读 · 0 评论 -
多线程学习笔记八——ReentrantReadWriteLock的使用
package day2;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.uti...原创 2018-09-11 17:00:31 · 147 阅读 · 0 评论 -
多线程学习笔记九——实现有界队列
package day2;import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class BlockingQu...原创 2018-09-11 17:38:43 · 269 阅读 · 0 评论 -
多线程学习笔记十——使用ConcurrentLinkedQueue代替ArrayList
package day4;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.ExecutorService;import java...原创 2018-09-11 18:27:06 · 1630 阅读 · 1 评论 -
多线程学习笔记十一——java里的阻塞队列
ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。 ·LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。 ·PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。 ·DelayQueue:一个使用优先级队列实现的无界阻塞队列。 可用于缓存,但redis已经有类似功能,所以感觉没什么用。 ·SynchronousQueu...原创 2018-09-12 10:49:42 · 168 阅读 · 0 评论 -
学习多线程笔记三——中断
package day1;import java.util.concurrent.TimeUnit;public class Interrupted { public static void main(String[] args){ // sleepThread不停的尝试睡眠 Thread sleepThread = new Thread(new S...原创 2018-09-11 11:38:32 · 102 阅读 · 0 评论