![](https://img-blog.csdnimg.cn/98ac5a450fe04e3989a52f05550a20e7.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 90
并发编程
爱吃糖的靓仔
这个作者很懒,什么都没留下…
展开
-
ThreadLocal源码以及内存泄漏的分析
文章目录1.ThreadLocal简介2.ThreadLocal的简单使用3.ThreadLocal的内部设计3.1 早期的设计3.2 现在的设计3.3 优化后的好处4.ThreadLocal的核心源码4.1 set方法4.2 get方法4.3 Remove方法4.4 setInitialValue方法4.ThreadLocalMap源码解析4.1整体结构4.2 成员变量4.3 存储结构5:弱引用...原创 2020-05-06 22:55:09 · 515 阅读 · 0 评论 -
(四)多线程---多线程的并发编程
文章目录JOIN的使用线程的三大特性什么是原子性什么是可见性什么是有序性java的内存模型voliate关键字volatile 的原子性volatile与synchronized区别线程安全性ThreadLocal案例示范线程池什么是线程池线程池的作用创建线程池的四种方式newCachedThreadPoolnewFixedThreadPoolnewScheduledThreadPool\newS...原创 2019-08-05 22:51:26 · 224 阅读 · 1 评论 -
(五)多线程------Java并发包
什么是线程安全问题?保证在多个线程之间共享同个全部变量或静态变量,保证数据的一致性和原子性。ConcurrentMap解析ConcurrentMap接口下有俩个重要的实现 :ConcurrentHashMapConcurrentskipListMap (支持并发排序功能。弥补ConcurrentHas hMa p)ConcurrentHashMap内部使用段(Segment)来表示这...原创 2019-10-24 13:17:55 · 448 阅读 · 1 评论 -
并发专题之---Voliate引发的各种原理问题
文章目录voliate不保证原子性voliatevoliate是java虚拟机提供的轻量级的同步机制.他保证了可见性,不保证原子性,禁止指令重排不保证原子性代码案例package com.bwie.demo;/** * 不能保证原子性 * 理论来个每个线程+1000 结果为2000,但是结果却是小于2000的值 */public class VolatileUnsafe2 {...原创 2019-11-04 00:17:32 · 2865 阅读 · 6 评论 -
并发专题之---并发中集合出现的问题
文章目录ArrayList问题的出现为什么会出现这个问题解决方案为什么CopyOnWriteArrayList可以解决HashSet问题的出现HashSet结构解决办法为什么CopyOnWriteArraySet可以解决Map问题的出现解决办法ArrayList问题的出现案例1public class SingletonDemo { public static void main(...原创 2019-11-04 21:32:03 · 356 阅读 · 0 评论 -
并发专题之--- JUC常用工具类
文章目录CountDownLatchCountDownLatch理解: 可以把CountDownLatch看成火箭发射倒计时,也就是当其他条件满足的时候,才开始某个线程的运行.例子:比如放学了,班长必须等全部同学走完啦,才可以关门,也就是说关门的这个操作,必须放在最后一步.先看下不用CountDownLatch的的结果public class SpinDemo { public ...原创 2019-11-05 14:21:37 · 126 阅读 · 0 评论 -
并发专题之--- 阻塞队列
文章目录什么是阻塞队列阻塞队列的好处是什么?阻塞队列的架构BlockingQueue的核心方法抛出异常特殊值阻塞超时SynchronousQueue什么是阻塞队列阻塞队列的好处是什么?1.阻塞队列有没有好的一面?我们日常吃过海底捞,当人满的时候,店主给的建议是让我们在外面等候,等什么时候有桌位啦,我们才进去,如果没有阻塞队列的话,此时总不能店员把我们赶出去吧.2:不得不阻塞,你如何管...原创 2019-11-05 21:29:50 · 186 阅读 · 0 评论 -
并发专题之---线程池
文章目录一: 为什么要用线程池二: 线程池常用的3个方式一: 为什么要用线程池二: 线程池常用的3个方式原创 2019-11-08 13:56:09 · 380 阅读 · 0 评论 -
并发常见笔试题
前言:以下问题还有答案均为过去我写博客写的总结,同时面试也可能会问,理解并真正的懂,勤于实践才是提高之本.题目一:发送用户10W邮件,如何多线程提高效率/** * 目前公司有1万个个用户,现在公司需要做活动,给每一个用户发送一条祝福短信。 */class Message implements Runnable{ private List<Object> list...原创 2019-11-12 00:55:21 · 319 阅读 · 0 评论 -
JUC并发编程高级篇第七章之AQS(读写锁的优化实践)
主要用于解决锁分配给"谁"的问题体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态比如常用的lock. unlock ,他们如何锁住线程的?阻塞的线程阻塞实现的具体逻辑是什么,这些统统都是AQS实现,可以这么说AQS提出统一 规范并简化了锁的实现,将其抽象出来屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的公共基础部分,由AQS由此衍生出了许多我们耳熟能详的JUC工具类ReentrantLock;原创 2023-04-10 18:19:54 · 467 阅读 · 0 评论 -
JUC并发编程高级篇第六章之Synchronized锁升级(无锁->偏向锁->自旋锁->重量锁)
先说好结论 ,全文都要都是围绕这几点进行分析的,看不得懂得可以看后面的分析讲解锁对象锁指向偏向锁MarkWord存储的是偏向线程的ID轻量锁MarkWord存储的是线程栈中的LockRecord指针重量锁MarkWord存储是指向堆中的monitor对象的指针。原创 2023-04-08 19:58:30 · 511 阅读 · 0 评论 -
JUC并发编程高级篇第五章之对象内存布局和对象头[new Object 占用多少字节? ]
对象头主要包括对象标记 (markWord),类元信息(类型指针) , 当我们声明一个类时(没有变量),此时他就是一个对象头。对象的构成主要是由对象头(header),实例数据(instance data),对齐填充(保证8字节的倍数) 组成的。虚拟机要求对象起始地址必须是8字节的整数倍,填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。类元信息存储的是指向对象类元数据的首地址,下面的2点。原创 2023-04-08 19:27:12 · 432 阅读 · 0 评论 -
JUC并发编程高级篇第四章之ThreadLocal(人手一份,天下安)
ThreadLocal当中ThreadLocalMap的数据结构和关系ThreadLocal的key是弱引用,为什么ThreadLocal的内存泄露ThreadLocal为什么最后加入了remove方法ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其getiset方法)都有自己的、独立初始化的变量副本。原创 2023-04-08 14:26:05 · 635 阅读 · 0 评论 -
JUC并发编程高级篇第三章之CAS[Unsafe和原子增强类]
CAS(Compare And Swap)的缩写,中文翻译成比较并交换,实现并发算法时常用到一种技术;他包含了3个操作数 ----- 内存位置,,预期原值,更新值。执行CAS操作的时候,将内存位置的值与原值进行比较如果相匹配,那么处理器会自动将该位置的值更新为新值如果不匹配,处理不做任何操作,多个线程同时执行CAS操作,只有1个会成功。原创 2023-04-08 11:05:31 · 731 阅读 · 0 评论 -
JUC并发编程高级篇第二章之Volatile(解决数据可见性和可续性)
Volatile是Java中的一个关键字,用于修饰变量。当一个变量被声明为volatile时,它的值可能会被多个线程同时访问和修改。volatile 的底层实现原理是内存屏障,也称内存栅栏,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作,避免代码重排序。原创 2023-04-07 16:23:08 · 609 阅读 · 0 评论 -
JUC并发编程高级篇第一章之Java内存模型(解决读取数据不一致的问题)
JMM 即 Java Memory Model,它本身是一种抽象的概念,并不是真实存在的,他仅仅描述了是一组约定和规范;通过这个规范定义了程序多个变量的读写方式,并决定一个线程对共享变量的写入何时以及如何变成对一个线程可见,关键他它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。原创 2023-04-07 14:46:24 · 515 阅读 · 0 评论 -
JUC并发编程基础篇第六章之LockSupport[notify,signal之外的另一种唤醒方式]
LockSupport类使用了一种名叫Permit的概念来做到阻塞和唤醒线程的功能,每个线程都有一个许可,但是与Semaphore不同,许可的累加上限是1。因为unpark获得了一个凭证,之后再调用park方法,就可以名正言顺的凭证消费,故不会阻塞。总结: Condition中的线程等待和唤醒都需要先获取锁,一定要先await,然后signal,顺序不能反。虽然unpark是一个生成一个许可证,但是他的上限只有1,只能通过1park,后面就无法通过了;一般情况下,我们们有如下3种办法去唤醒一个线程。原创 2023-04-06 16:17:55 · 481 阅读 · 0 评论 -
JUC并发编程基础篇第五章之线程中断状态[你理解的线程中断,只会Thread.interrupted()吗]
首先 - 线程的中断不应该由其他线程来中断或者停止,而是自己线程中断和停止;自己决定的命运,所以Thread.stop, Thread.suspend, Thread.resume都废弃了;其次 - 在java中没法立即停止一个线程,然后停止线程却显得尤为重要java中提供了一种用于停止线程的协商机制 – 中断, 也即中断标识协商机制中断只是一种协商机制,java中没有给中断增加任何语法,中断的过程完全由程序员自己实现。原创 2023-04-06 16:04:37 · 272 阅读 · 0 评论 -
JUC并发编程基础篇第四章之公平锁/重入锁/死锁[常见锁的基本认识]
概念: 可重入锁,也称为递归锁,是一种支持线程再次获取自身已经持有的锁的锁机制。换句话说,可重入锁允许一个线程在持有锁的情况下再次获取同一个锁,而不会发生死锁或其他问题。作用: 在多线程编程中,可重入锁能够有效地防止死锁和其他线程安全问题。当一个线程在持有锁时,如果它需要再次获取同一个锁(例如在递归调用时),如果锁不是可重入的,那么该线程将会被阻塞,导致死锁或其他问题的发生。而可重入锁允许同一个线程多次获取锁,从而避免了这种情况的发生。实现方法。原创 2023-04-06 15:57:58 · 759 阅读 · 0 评论 -
JUC并发编程基础篇第三章之Synchronized八锁案例[理解锁的对象]
作用对象锁的范围对于普通方法锁的是当前对象this对于静态方法锁的是当前类的class对象,如Iphone.class唯一的一个模板对于同步代码块锁的是synchronized(?) 里面的对象。原创 2023-04-06 15:28:57 · 966 阅读 · 0 评论 -
JUC并发编程基础篇第一章之进程/并发/异步的概念[理解基本概念]
进程:线程:区别:并发:并行:同步:异步:总结。原创 2023-04-06 14:56:55 · 774 阅读 · 0 评论 -
JUC并发编程基础篇第二章之CompletableFuture[加强版的线程]
一个阶段的计算,可以是一个function,consumer或者runnable. 比如stage.thenApply(x->square(x)).thenAccept(x->system.out.print(x)).thenReturn(()->system.out.println())比如我们最多只能等待5s, 但是如果get()方法执行10s的话, 则会影响我们的程序。一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发;执行完后,主线程才能执行任务, 输出耗时时间,我们的期望是。原创 2023-04-06 15:17:48 · 714 阅读 · 0 评论