多线程
多线程学习笔记
十月花
不放弃努力,超越自己,不断前行!学习编程的小伙伴们一起互相学习呀!
展开
-
学习笔记【多线程-第十三节:ConcurrentHashMap】
ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了提高查找效率。其实现了Serializable接口表示ConcurrentHashMap可以被序列化。ConcurrentHashMap和HashMap相比,还添加了Unsafe实例,主要用于反射获取对象相应的字段。主要的类Node类 Node类主要用于存储具体键值对,其子类有ForwardingNode、ReservationNode、TreeNode和TreeBin四个子类。四原创 2020-12-13 17:50:01 · 344 阅读 · 0 评论 -
学习笔记【多线程-第十二节:AQS】
AQS(Abstract Queued Synchronizer)抽象的队列的同步器,AQS定义了一套多线程访问共享资源的同步器,很多同步类底层都是它,如ReentrantLock、Semaphore、CountDownLatch…。拿ReentrantLock的lock()举例:以上为它的底层调用图,我们可以看到,最底层AQS的acquire()方法调用的是子类重写的tryAcquire()方法,而未用自己的tryAcquire()方法,自己的tryAcquire()方法是为了给子类重写的,这其实原创 2020-12-13 17:45:20 · 151 阅读 · 0 评论 -
学习笔记【多线程-第十一节:JUC Tools】
1、CountDownLatch(倒数门栓)private static void usingCountDownLatch(){ Thread[] threads=new Thread[100]; CountDownLatch latch=new CountDownLatch(threads.length); for (int i=0;i<threads.length;i++){ threads[i]=new Thread((原创 2020-12-12 21:35:02 · 209 阅读 · 0 评论 -
学习笔记【多线程-第十节:ReentrantLock可重入锁】
ReentrantLock可以替代synchronized(Lock lock=new ReentrantLock();),底层是CAS。在原来synchronized(this) 的地方加 lock.lock();,而且必须用lock.unlock();进行解锁,解锁必须写在finally里面以保证解锁。1、可使用tryLock尝试锁定boolean locked = false;try{ locked = lock.tryLock(5,TimeUnit.SECONDS); System.ou原创 2020-12-12 21:35:59 · 83 阅读 · 1 评论 -
学习笔记【多线程-第九节:线程池】
线程也叫轻量级进程LWP(Light Weight Process)两种线程模型用户级线程ULT:用户程序实现,不依赖操作系统核心,应用提供创建,同步,调度和管理线程的函数来控制用户线程;不许用户态/内核态切换,速度快;内核对ULT无感知,线程阻塞及进程阻塞。内核级线程KLT:系统内核管理线程,内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT慢,比进程操作快。Java用的时KLT线程模型。UL原创 2020-12-11 14:52:57 · 104 阅读 · 0 评论 -
学习笔记【多线程-第八节:volatile个人详解】
其实说volatile,个人觉得比synchronized简单多了,他并不是一个锁,只是一个可以修饰的关键字,作用就两个:可见性与禁止指令重排序。可见性与禁止指令重排序我们先来看一个简单的例子:public class NowTest { private static boolean temp=true; public static void main(String[] args) { new Thread(()->{ while(temp原创 2020-12-10 19:21:57 · 97 阅读 · 0 评论 -
学习笔记【多线程-第七节:synchronized锁优化、Thread Local及Cache Line】
回顾在上一节,我们提到了synchronized的一些底层实现,这节我们把剩下的说一说。java代码: synchronized字节码中: 有ACC_SYNCHRONIZED这么一个标志,后面有monitorenter和monitorexit。在汇编信息中: 有lock cmpxchg的字样,也就是说,其实synchronized的底层,也是靠lock 与CAS实现的。对象在内存中的储存分布在讲synchronized前需要先说一下储存分布等Class Pointer(类型原创 2020-12-10 15:31:47 · 280 阅读 · 2 评论 -
学习笔记【多线程-第六节:JMM简图 及 synchronized的特性】
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系,这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行,happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前。原创 2020-12-08 21:25:37 · 144 阅读 · 0 评论 -
学习笔记【多线程-第五节:CAS与Atomic类】
CASCompare and Swap(Compare and Exchange、Compare and Set)以下都是个人学习的个人理解,CAS可以称为是无锁、自旋锁,可以说是乐观锁,他是很多种锁的底层实现,大多用来实现原子性。CAS中有三个词,当前值E,计算结果值V与新值N,例如这里有一个括号(E),先读取当前括号中的值E,随后线程会有一个计算结果值V,然后此时再看看括号中的值还是否为E,若为E,则说明没有其他线程动过这个值,则在括号中赋值上V;若不为E,说明其他线程动修改了E值,则回到读取操原创 2020-12-07 23:50:01 · 188 阅读 · 0 评论 -
学习笔记【多线程-第四节:synchronized的浅显基础及安全问题】
线程同步线程异步模型各线程自己执行自己的,互相没有什么关联,比如有两个线程,一个是弟弟在吃饭,一个是姐姐在看电视,谁也没有影响到谁。线程同步模型在我理解,就是线程之间存在着某种等待关系,一个线程执行时必须等另一个行程结束,好比有两个线程,一个共享对象菜,有两个线程,姐姐夹菜和弟弟夹菜,姐姐夹菜时弟弟需要等着,弟弟夹菜时需要等着,这样的话效率较低,需要排队执行,其中涉及到了关键字synchronized(同步)。线程安全问题存在安全问题的条件1.多线程并发2.有共享数据3.都对共享对象有修改原创 2020-12-06 17:56:51 · 97 阅读 · 0 评论 -
学习笔记【多线程-第三节:合理终止线程】
终止线程原有终止线程的方法stop();,但如今方法已经过时,不建议使用,因为这种方法是直接中断掉线程,可能这时还有一些数据没有保存,会导致数据丢失。又或者让其睡很长很长的时间,但终究是终止,这样也是不合理的。合理终止(打布尔标识):终止练习:主线程到3时,mst线程开始,到7时,将布尔标记改为false,这里未使用volatile。public class ThreadSleepTest { public static void main(String[] args) {原创 2020-12-05 19:43:25 · 82 阅读 · 0 评论 -
学习笔记【多线程-第二节:线程调度模型】
线程的优先级每个线程都有优先级,最高是10,最低是1,默认为5。修改优先级:void setPriority(int num);读优先级:int getPriority();均分式调度模型:平均分配cpu时间片,每个线程占有的cpu时间片时间长度相同。抢占式调度模型:关于线程这么重要的知识我听了两个老师的网课,只有一个提到了,java是抢占式调度模型,他说,哪个线程的优先级比较高,抢到cpu时间片的概率就会高一些或者说大一些。感觉说的有些笼统,我就去网上查,得到了这样的说法:java虚拟机原创 2020-12-05 19:27:28 · 208 阅读 · 0 评论 -
学习笔记【多线程-第一节:多线程基础】
1.进程与线程进程:一个应用程序,线程的集合,cpu分配资源的基本单位。线程:一个进程的执行单元/执行场景。cpu执行的基本单位。2.串行、并发、并行串行:执行完一个线程后再去执行另一个。并发:因为cpu处理的速度极快,不同线程或者说是进程之间不停的切换,给人一种像是在同一时间执行的感觉。并行:真正意义上的在同一时间同时处理多个线程或者说进程,一般多核cpu可实现。3.多线程共享在java中,多个线程的heap area和method area内春共享,但是栈是内存独立的,一个线程一个栈。原创 2020-12-05 18:56:33 · 71 阅读 · 0 评论