多线程
文章平均质量分 75
集合、多线程
Alice_whj
记录生活点点滴滴
展开
-
ThreadLocal简介
这样的话,ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话(比如线程池的核心线程),这些key为null的Entry的value就会一直存在一条强引用链:Thread变量 -> Thread对象 -> ThreaLocalMap -> Entry -> value -> Object 永远无法回收,造成内存泄漏。ThreadLocal的很重要一个注意点,就是使用完,要手动调用remove()。原创 2024-05-27 16:56:30 · 552 阅读 · 0 评论 -
27 线程、线程池及实现代码总结
1.抛砖引玉线程一个任务public class Task implements Runnable{ @Override public void run(){ System.out.println("is excuting task"); }}public void test(){ Task task=new Task(); Threa...原创 2019-12-12 19:42:35 · 104 阅读 · 0 评论 -
30 锁的相关讲解
使用synchronized获取互斥锁的几点说明原文链接:https://blog.csdn.net/ns_code/article/details/17199201采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁...原创 2019-12-13 20:18:59 · 118 阅读 · 0 评论 -
37 优先队列(堆)
优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列ADT来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素).。优先队列的实现比较堆是一颗具有特定性质的二叉树,堆的基本要求就是堆中所有结点的值必须大于或等于(或小于或等于)...原创 2019-12-24 19:33:36 · 155 阅读 · 0 评论 -
43 多线程知识集锦
多线程java中有几种方法可以实现一个线程?继承Thread类;实现Runnable接口;实现Callable接口通过FutureTask包装器来创建Thread线程;使用ExecutorService、Callable、Future实现有返回结果的多线程(也就是使用了ExecutorService来管理前面的三种方式)。详情参见:https://radiancel.github.i...转载 2020-01-02 10:23:35 · 90 阅读 · 0 评论 -
64 并发问答
进程与线程:与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。程序计数器为什么是私有的?为了线程切换后能恢复到正确的执行位置。虚拟机栈和本地方法栈为什么是私有的?所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈...原创 2020-03-01 23:10:39 · 152 阅读 · 0 评论 -
88 并发编程极客学习笔记
01 | 可见性、原子性和有序性问题:并发编程Bug的源头并发问题产生的根源:源头之一:缓存导致的可见性问题多核时代,每颗 CPU 都有自己的缓存源头之二:线程切换带来的原子性问题Java 并发程序都是基于多线程的,自然也会涉及到任务切换,操作系统做任务切换,可以发生在任何一条 CPU 指令执行完,是的,是 CPU 指令,而不是高级语言里的一条语句。我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。CPU 能保证的原子操作是 CPU 指令级别的,而不是高级语言的操作符。原创 2021-04-23 10:21:00 · 194 阅读 · 1 评论 -
89 极客笔记:并发工具类
14 | Lock和Condition(上):隐藏在并发包中的管程Java SDK 并发包通过 Lock 和 Condition 两个接口来实现管程,其中 Lock 用于解决互斥问题,Condition 用于解决同步问题。synchronized 申请资源的时候,如果申请不到,线程直接进入阻塞状态了,而线程进入阻塞状态,啥都干不了,也释放不了线程已经占有的资源。15 | Lock和Condition(下):Dubbo如何用管程实现异步转同步?16 | Semaphore:如何快速实现一个限流器原创 2021-04-28 18:44:42 · 137 阅读 · 0 评论 -
HashMap线程安全问题
在多线程情况下,jdk1.7扩容时会产生循环问题因为采用头插法扩容在jdk1.8中对HashMap进行了优化,在发生hash碰撞,不再采用头插法方式,而是直接插入链表尾部,因此不会出现环形链表的情况,但是在多线程的情况下仍然不安全;HashMap中put操作的如果线程A和线程B同时进行put操作,刚好这两条不同的数据hash值一样,并且该位置数据为null。假设一种情况,线程A进入后还未进行数据插入时挂起,而线程B正常执行,从而正常插入数据,然后线程A获取CPU时间片,此时线程A不用再进行ha原创 2022-03-05 19:12:32 · 1034 阅读 · 0 评论 -
AQS相关
AQS的实现依赖内部的同步队列,也就是FIFO的双向队列,如果当前线程竞争锁失败,那么AQS会把当前线程以及等待状态信息构造成一个Node加入到同步队列中,同时再阻塞该线程。非公平锁中, 拥有锁的线程在释放锁资源的时候, 当前尝试获取锁资源的线程可以和等待队列中的第一个线程竞争锁资源, 这就是ReentrantLcok中非公平锁的含义;重入锁的意思就是,线程thread1执行ReentrantLock的lock()方法获取到锁之后且没有释放锁,再次调用lock()方法的时候,不会阻塞,直接增加重入次数。原创 2022-03-07 18:42:39 · 110 阅读 · 0 评论 -
并发 bibili.
锁他的原理原创 2022-03-20 10:28:56 · 231 阅读 · 0 评论