#并发专题
文章平均质量分 91
并发专题
验证码有毒
2017年7月毕业于东莞猴赛雷社会学院。码农届的搬砖员
展开
-
【并发专题】从0开始深入理解并发、线程与等待通知机制(上——前置知识)
编写可靠的代码编写高性能代码优化用户体验充分利用 CPU 的资源… …但是在学习之前,我们需要学习一些概念。即,什么是进程和线程?学习了一些计算机基础原理知识,重新认识一下进程、线程的概念学习了CPU核心数与线程数的关系,以及CPU核心数跟逻辑核心数,还有Runtime.getRuntime().availableProcessors()的返回内容本质学习了上下文切换的概念学习了并行与并发的概念*上下文切换。原创 2023-07-12 22:03:49 · 104 阅读 · 0 评论 -
【并发专题】从0开始深入理解并发、线程与等待通知机制(中——认识JAVA里的线程)
一个 Java 程序从 main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是多线程程序,因为执行 main()方法的是一个名称为 main 的线程。而一个 Java 程序的运行就算是没有用户自己开启的线程,实际也有有很多JVM 自行启动的线程,一般来说有:[6] Monitor Ctrl-Break //监控 Ctrl-Break 中断信号的[5] Attach Listener //内存 dump,线程 dump,类信息统计,获取系统属性等[原创 2023-07-12 23:40:51 · 185 阅读 · 0 评论 -
【并发专题】从0开始深入理解并发、线程与等待通知机制(下——Java线程间的通信和协作)
关键字: 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,使多个线程访问同一个变量的结果正确,它又称为内置锁机制。// 线程t1,对count增加了10000次 Thread t1 = new Thread(() -> {i < 10000;i ++) {} System . out . println("t1计数完了,我这里的count=" + test . getCount());原创 2023-07-14 22:48:15 · 196 阅读 · 0 评论 -
【并发专题】导致JVM内存泄露的ThreadLocal详解
学习了ThreadLocal的基本使用学习了ThreadLocalMap,并且知悉它与ThreadLocal和Thread的关系学习了为什么需要ThreadLocalMap学习了ThreadLocalMap使用中,容易导致JVM溢出的场景。原创 2023-07-15 22:56:30 · 335 阅读 · 0 评论 -
【并发专题】CAS&Atomic 原子操作详解
什么是原子性,什么是原子操作,我想大家应该都知道吧。原子操作就是【一系列方法,要么全部执行,要么全部不执行】,这就是原子操作。最典型的就是数据库事务里面的操作。在并发里,同样存在原子性,他跟上面说到的原子操作是一样的内涵和概念。假定有两个操作A和B都包含多个步骤,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,执行B的线程看A的操作也是一样的,那么A和B对彼此来说是原子的。Java提供的Atomic系列的原子操作类,原创 2023-07-17 17:57:42 · 219 阅读 · 0 评论 -
【并发专题】一节课学透面试必问并发安全问题
学习了线程安全相关知识学习了死锁产生的原因,及如何打破死锁认识了活锁学习了单例模式的线程安全特性。原创 2023-07-17 23:08:54 · 92 阅读 · 0 评论 -
【并发专题】JUC并发工具类在大厂的应用场景详解
ReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一个锁而不会被阻塞。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。Semaphore(信号量)是一种用于多线程编程的同步工具,用于控制同时访问某个资源的线程数量。它通过维护若干个许可证来控制线程对资源的访问。当许可证数量大于零时,线程可以访问;反之,则拒绝,并阻塞线程让其等待。许可证的数量,就是最多可访问线程数。原创 2023-07-18 23:07:31 · 372 阅读 · 0 评论 -
【并发专题】深入理解AQS独占锁之ReentrantLock源码分析
方法介绍:使用CAS方式设置state状态。在这里并没有直接对【共享变量:state】字段做操作,而是通过【当前对象地址+偏移量】的方式索引state字段,再调用本地native方法CAS设置【共享变量:state】字段值为1。(PS:这里是第1次尝试获取锁)方法介绍:这个方法本质上是调用了后面要提到的两个和方法。也是一个用来获取锁的方法方法介绍:将当前线程封装成Node节点,添加到等待队列当中。原创 2023-07-21 18:04:51 · 281 阅读 · 0 评论 -
【并发专题】阻塞队列BlockingQueue实战及其原理分析
当阻塞队列插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。ArrayBlockingQueue是一个典型的有界队列,它是基于数组结构来存储元素。初始化时需要指定容量大小,利用 ReentrantLock 实现线程安全。LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,原创 2023-07-23 22:34:57 · 268 阅读 · 0 评论 -
【并发专题】线程池ThreadPoolExecutorl底层原理源码分析
线程池严格来说是一种池化技术,重在资源重复利用,它就是一种多线程存在形式。在多线编程中,创建和销毁线程一项开销较的操作,所以线程池通过预先创建一组线程,并将任务分配给这些线程来提供高效的线程管理。线程池通常包括一个线程队列和一个任务队列。线程队列中保存着可供复用的线程,任务队列中保存着需要执行的任务。从上面我们可以看到,线程池有着显著的优点:降低资源消耗、提高响应速度、方便管理;可以复用线程、控制最搭并发数、管理线程等。原创 2023-07-25 23:31:04 · 186 阅读 · 0 评论 -
【并发编程】ForkJoinPool工作原理分析
归并排序(Merge Sort)是一种基于分治思想的排序算法。归并排序的基本思想是将一个大数组分成两个相等大小的子数组,对每个子数组分别进行排序,然后将两个子数组合并成一个有序的大数组。因为常常使用递归实现(由先拆分后合并的性质决定的),所以我们称其为归并排序。将数组分成两个子数组对每个子数组进行排序合并两个有序的子数组归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),其中n为数组的长度。原创 2023-07-30 00:31:44 · 394 阅读 · 0 评论 -
【并发专题】操作系统模型及三级缓存架构
学习了一些计算机系统模型学习了CPU三级缓存结构。原创 2023-07-30 21:58:31 · 1417 阅读 · 0 评论 -
【并发专题】深入理解并发可见性、有序性、原子性与JMM内存模型
Java内存模型(Java Memory Model简称JMM),它是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。我们知道,JVM运行Java程序的本质,是运行线程。原创 2023-07-30 23:32:07 · 194 阅读 · 0 评论 -
【并发专题】手写MyReentantLock
事实上,上面的很多东西AQS已经帮忙实现了,所以想要复刻一个不是很难。Lock至于为什么需要实现这三个接口,看如下注释:总的来说:实现lock()是因为我们需要实现可重入的话,需要自己写逻辑;实现,则是因为提供一种机制,让任务尽量可能在进入阻塞队列之前,能获取到锁。因为,进了阻塞队列之后,这个代价是昂贵的;实现,则是因为这个方法是【释放锁】的核心方法。想要实现可重入的逻辑就得维护这个方法。原创 2023-08-01 15:38:41 · 137 阅读 · 0 评论 -
【并发专题】手写LinkedBlockingQueue
下面只是简单的实现了。原创 2023-08-01 22:10:14 · 185 阅读 · 0 评论 -
【并发专题】单例模式的线程安全(进阶理解篇)
饿汉式(Eager Initialization,急切的初始化),在类加载时就创建单例实例,并在需要时直接返回该实例。这种方式的实现是线程安全的,因为在类加载过程中实例已经创建好了。懒汉式(Lazy Initialization),在首次调用时创建单例实例,存在线程安全问题。如果多个线程同时进入判断条件,可能会创建多个实例。这里通过利用JVM类加载【天生线程安全】的特性,来帮助实现【懒汉式】的单例。如何做到呢?答案是【静态内部类】。原创 2023-08-03 12:12:16 · 1094 阅读 · 0 评论