
多线程
文章平均质量分 69
电池
伏加特遇上西柚
犹如烈焰般的伏特加和温柔酸甜的西柚碰撞在一起,将是一种美好的相遇。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ThreadLocal学习路径
1、ThreadLocal 超强图解,这次终于懂了~(深入介绍)2、保姆级教学,22张图揭开ThreadLocal(总结性介绍)3、多图深入分析ThreadLocal原理(源码方式介绍)4、线程本地存储 ThreadLocal(一般接介绍)原创 2023-07-22 14:54:52 · 175 阅读 · 0 评论 -
线程本地存储 ThreadLocal
内存泄漏(Memory leak)本质上,内存泄漏可以定义为:当进程不再需要某些内存的时候,这些不再被需要的内存依然没有被进程回收。造成内存泄漏的原因:不再需要(没有作用)的实例对象依然存在着强引用关系,无法被垃圾收集器回收是通过递增的 AtomicInteger 作为 ThreadLocal 的 hashCode 的;转载 2023-07-15 11:43:17 · 545 阅读 · 0 评论 -
多图深入分析ThreadLocal原理
主要学习一下ThreadLocal的原理转载 2023-07-15 10:11:30 · 205 阅读 · 0 评论 -
通过自定义线程池和completableFuture实现数据批量插入数据库
大数据批量新增or修改太慢太Low,线程池、CountDownLatch、CompletableFuture完美解决多线程批量插入数据到mysql基于CompletableFuture+多线程+内存分页实现的批量查询技巧原创 2023-07-09 20:46:40 · 1243 阅读 · 0 评论 -
线程的 run()和 start()有什么区别
调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是thread 的一个普通方法调用,还是在主线程里执行。原创 2023-07-03 17:20:26 · 346 阅读 · 0 评论 -
Async 使用详解
使用 @Async可以实现程序的异步执行,完成程序优化;被调用方法和调用方法处理同一个类中会导致异步失效同一个类中。失效的代码void a() {this . b();} }正常的代码void a() {} }从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案。原创 2023-06-02 13:53:49 · 5864 阅读 · 0 评论 -
ThreadLocal介绍
线程本地存储 ThreadLocal面试中再问到ThreadLocal,应该这么答ThreadLocal类(线程本地存储)详解原创 2023-05-31 14:33:36 · 107 阅读 · 0 评论 -
基于数据库实现乐观锁
悲观锁可以实现对于数据的串行化执行,比如syn,和lock都是悲观锁的代表,同时,悲观锁中又可以再细分为公平锁,非公平锁,可重入锁,等等乐观锁一般会使用版本号机制或 CAS 算法实现,CAS 算法相对来说更多一些,这里需要格外注意。版本号机制一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会加一。原创 2023-05-23 15:30:05 · 4375 阅读 · 1 评论 -
并发编程---java锁(三)
关键字可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时可以保证一个线程的变化可见(可见性),即可以代替volatile使用方法1. 普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁 2. 静态同步方法,锁是当前类的 class 对象 ,进入同步代码前要获得当前类对象的锁 3. 同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁(1)当⼀个线程试图访问同步代码块时,它⾸先必须得到锁,退出或抛出异常时必须释放锁。原创 2023-03-10 17:31:46 · 1058 阅读 · 0 评论 -
LinkedList源码分析
List接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现List接口外,LinkedList类还为在列表的开头及结尾getremove和insert元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈队列或双端队列。有序性 : 存入和取出的顺序是一致的元素可以重复 :含有带索引的方法独有特点 : 数据结构是链表,可以作为栈、队列或者双端队列!LinkedList是一个双向的链表结构,双向链表的长相,如下图!原创 2023-03-17 17:28:59 · 985 阅读 · 0 评论 -
ArrayList源码分析
ArrayList集合是Collection和List接口的实现类。底层的数据结构是数组。数据结构特点 : 增删慢,查询快。线程不安全的集合!许多程序员开发的时候,使用集合基本上无脑选取ArrayList!不建议这种用法。单列集合 : 对应与Map集合来说【双列集合】有序性 : 存入的元素和取出的元素是顺序是一样的元素可以重复 : 可以存入两个相同的元素含带索引的方法 : 数组与生俱来含有索引【下角标】原创 2023-03-17 15:48:35 · 763 阅读 · 0 评论 -
线程池配置工具类
【代码】线程池配置工具类。原创 2023-03-16 10:16:14 · 472 阅读 · 0 评论 -
并发编程---线程池(六)
对于CPU密集型任务,最⼤线程数是CPU线程数+1。对于IO密集型任务(文件上传下载),尽量多配点,可以是CPU线程数*2,或者CPU线程数/(1-阻塞系数)。IO密集型,即该任务需要⼤量的IO,即⼤量的阻塞。在单线程上运⾏IO密集型的任务会导致浪费⼤量的CPU运算能⼒浪费在等待。所以在IO密集型任务中使⽤多线程可以⼤⼤的加速程序运⾏,及时在单核CPU上,这种加速主要就是利⽤了被浪费掉的阻塞时间。原创 2023-03-14 18:26:36 · 939 阅读 · 0 评论 -
CompletableFuture使用详解
1、CompletableFuture 使用详解原创 2021-08-10 19:44:37 · 801 阅读 · 0 评论 -
并发编程---阻塞队列(五)
需要注意的是 LinkedBlockingQueue 虽然是有界的,但有个巨坑,其默认⼤⼩是 Integer.MAX_VALUE ,⾼达21亿,⼀般情况下内存早爆了(在线程池的 ThreadPoolExecutor 有体现)。while是循环语句,当满足条件时执行语句,执行完循环以后再回来判断是否满足,满足继续执行,然后继续判断,不满足直接执行下面的语句。队列只有⼀个元素,如果想插⼊多个,阻塞到队列元素取出后,才能插⼊,只能有⼀个“坑位”,⽤⼀个。当队列是满的,从队列中添加(Put)元素的操作将会被阻塞。原创 2023-03-13 20:12:28 · 830 阅读 · 0 评论 -
并发编程---常⽤辅助类(四)
在高并发的情况下通常会用到一下线程安全的辅助类。原创 2023-03-11 22:53:04 · 416 阅读 · 0 评论 -
并发编程---Volatile关键字(一)
并发与并⾏的不同?并发,如同,秒杀⼀样,多个线程访问同⼀个资源并⾏,⼀堆事情 ⼀块去做,如同,⼀遍烧热⽔,⼀个拆⽅便⾯包装AtomicInteger 原⼦性引⽤Lock接⼝ReentrantLock 可重⼊锁ReadWriteLock 读写锁。原创 2023-03-09 20:20:27 · 1397 阅读 · 0 评论 -
并发编程---CAS详解(二)
CAS的全称为Compare-And-Swap,⽐较并交换,是⼀种很重要的同步思想。它是⼀条CPU并发原语。它的功能是判断主内存某个位置的值是否为跟期望值⼀样,相同就进⾏修改,否则⼀直重试,直到⼀致为⽌。这个过程是原⼦的。看下⾯这段代码,思考运⾏结果是/*** CAS的全称为Compare-And-Swap,比较并交换,是一种很重要的同步思想。它是一条CPU并发原语。* 它的功能是判断主内存某个位置的值是否为跟期望值一样,相同就进行修改,否则一直重试,直到一致为止。这个过程是原子的。原创 2023-03-07 23:02:12 · 1078 阅读 · 0 评论 -
并发编程学习有道云笔记
04-Java并发线程池底层原理详解与源码分析05-并发编程之深入理解Java线程06-并发编程之深入理解CAS原创 2023-03-06 21:19:22 · 136 阅读 · 0 评论 -
线程间的通信
1、什么是多线程之间通信多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。于是我们引出了等待唤醒机制:(wait()、notify())wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。如果对象调用原创 2020-12-12 10:55:03 · 137 阅读 · 0 评论 -
线程池
1、 什么是线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,2、创建线程的几种方式?工具类 : Executors:线程池的工具类,可以快捷的创建线程池Execu原创 2020-12-12 10:39:39 · 136 阅读 · 0 评论 -
线程常用的锁
1、悲观锁悲观锁就是悲观思想,即认为写多读少,遇到并发的可能性高。总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。2、乐观锁乐观锁是一种思想,即认为读多原创 2020-12-12 10:16:57 · 505 阅读 · 0 评论 -
线程相关面试题
什么是线程池?线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。为什么要使用线程池?01:降低资源的消耗 02:提高响应的速度 03:方便管理 (重点)线程复用、可以控制最大并发数、管理线程说说几种常见的线程池及使用场景1、newSingleThreadExecutor创建原创 2020-12-10 22:33:55 · 123 阅读 · 0 评论 -
run()方法和start()方法有什么区别?
系统通过调用线程类的start()方法来启动一个线程,此时线程处于就绪状态,而非运行状态,也就意味着这个现象被JVM调度执行。在调度过程中,JVM通过调用线程类的run()方法来完成实际的操作,当run()方法结束后,此线程就会终止。如果直接调用线程类的run方法,会被当做一个普通的函数调用,程序中仍然只有主线程这一个线程,也就是说,start()方法能够异步调用run()方法,但是直接调用run()方法是同步的,无法达到多线程的目的。...原创 2020-08-01 21:31:20 · 466 阅读 · 0 评论 -
线程状态和线程池状态
有六种状态;新创建(NEW)可运行(Runnable)锁阻塞(Blocked)无线等待(Waiting)计时等待(Timed Waiting)被终止(Terminated)原创 2020-08-01 21:15:59 · 371 阅读 · 0 评论 -
什么是死锁?
两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待的现象叫做死锁。产生死锁的条件:多个锁多个线程锁的嵌套原创 2020-08-01 21:08:17 · 135 阅读 · 0 评论 -
实现多线程有几种方式?
实现多线程有几种方式?一.继承Thread类,重写run方法Java中通过继承Thread类来创建并启动多线程的步骤如下:定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。创建Thread子类的实例,即创建了线程对象调用线程对象的start()方法来启动该线程public class Demo { public static void main(String[] args) {原创 2020-08-01 20:57:49 · 184 阅读 · 0 评论 -
同步和异步有什么区别?
同步问题引出,当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用,否则,程序运行结果将不可预料,在这种情况下就必须对数据进行同步。例如线程A需要使用Z资源,如果Z资源正在被B线程使用,同步机制就会让A等待,直到B线程结束对该资源的使用后,A线程才能使用Z资源,同步机制能够保证资源的安全。如何实现同步?1.同步代码块加同步格式:synchronized( 需要一个任意的对象(锁) ){代码块中放操作共享数据的代码。}上述的格式称为多线程中的同步代码块。同原创 2020-08-01 19:51:55 · 278 阅读 · 0 评论