并发编程
文章平均质量分 72
人生有三大境界:看山是山,看山不是山,看山还是山。
༄༊心灵骇客༣
路漫漫其修远兮,吾将上下而求索。
展开
-
多线程与高并发(八)
多线程与高并发(八)ThreadPoolThreadPoolExecutorForkJoinPoolThreadPool目前提供两种类型的线程池,一种是普通的类型ThreadPoolExecutor,第二种就是ForkJoinPool。这两种是不同类型的线程池。ThreadPoolExecutorForkJoinPool在阿里JAVA开发手册中有说明到:线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资原创 2022-04-29 12:37:21 · 146 阅读 · 0 评论 -
多线程与高并发(二)
多线程与高并发(二)volatileVolatile不能保证原子性synchronized优化CAS(无锁优化,自旋)ABA问题volatile保证线程可见性 - MESI(缓存一致性协议)禁止指令重排序 - DCL单例 - Double Check LockVolatile不能保证原子性volatile并不能保证多个线程共同修改running变量时带来的不一致问题,也就是说volatile不能替代synchronized原创 2022-04-26 23:51:24 · 158 阅读 · 0 评论 -
多线程与高并发(四)
多线程与高并发(四)强引用软引用弱引用虚引用强引用普通的引用就是强引用。public class NormalReference { public static void main(String[] args) throws IOException { NormalReference m = new NormalReference();// m = null; System.gc(); System.in.read();原创 2022-04-28 00:56:50 · 271 阅读 · 0 评论 -
多线程与高并发(七)
多线程与高并发(七)ExecutorExecutorServiceCallableFutureTaskCompletableFutureExecutor这个接口可以定义线程的运行方式。只有一个execute方法。(在将来的某个时间执行给定的命令。)public interface Executor { void execute(Runnable command);}ExecutorService它继承了Executor,它除了实现Executor可以实现的一个任务之外,它还完善了整个任原创 2022-04-29 10:31:24 · 280 阅读 · 0 评论 -
多线程与高并发(一)
多线程与高并发(一)前言线程的相关概念线程的3个方法线程的状态锁的相关概念线程同步synchronized异常与锁synchronized的底层实现前言写这一专栏目的是为了复习多线程与高并发的知识体系,由于是为了捡起来丢掉的东西,所以笔者写的都是关键的一些东西,并没有详细去阐述,对于新手不是很友好,对于有基础的程序员可以从中窥一而知全貌。这是学习的一个非常好的方法。线程的相关概念线程:一个程序里不同的执行路径。线程的启动方式:extends Threadimplements Runnable原创 2022-04-26 11:32:19 · 155 阅读 · 0 评论 -
多线程与高并发(五)
多线程与高并发(五)Vector vs HashtableCopyOnWriteListVector vs Hashtable都是自带锁,现在基本不用。CopyOnWriteList写时复制,当我们需要往里加东西的时候,需要把里面的东西复制出来。在很多时候,它写的次数比较少,读的次数比较多。这时就可以考虑CopyOnWriteList。public E get(int index) { return get(getArray(), index); }使用CopyOnWr原创 2022-04-28 20:19:57 · 165 阅读 · 0 评论 -
多线程与高并发(三)
多线程与高并发(三)ReentrantLockReentrantLock vs synchronizedCountDownLatchCyclicBarrierPhaserReadWriteLockSemaphoreExchangerLockSupportReentrantLocksynchronized是可重入锁,ReentrantLock也是可重入锁,reentrantlock用于替代synchronized由于m1锁定this,只有m1执行完毕的时候,m2才能执行,这里是复习synchronize原创 2022-04-27 02:18:11 · 173 阅读 · 0 评论 -
多线程与高并发(六)
阻塞队列中比较特殊的几个队列DelayQueueSynchronusQueueTransferQueueDelayQueue按时间进行任务调度。本质上是一个PriorityQueue实现的。SynchronusQueue用来给另外一个线程下达任务的。一定是另外一个线程需要,如果不需要直接在本线程装是不行的。直接拿在手里,什么时候另一个线程来了,就递给它。相当于两个线程交换数据。TransferQueue它最牛逼的一个地方在于它有一个方法transfer();它和put的区别:一个线程来了,装完了原创 2022-04-29 00:24:11 · 271 阅读 · 0 评论 -
缓存一致性协议(MESI)
MESIcpu执行计算的流程发展背景MESI协议MESI的执行原理cpu执行计算的流程在目前主流的计算机中,cpu执行计算的主要流程如图所示:数据加载流程如下:程序和数据从硬盘加载到内存中再从内存加载到缓存中(目前大多是三级缓存,数据加载:L3->L2->L1)然后再将缓存中的数据加载到寄存器中,并进行运算最后将数据刷新回缓存,并在一定的时间周期之后刷新回内存发展背景现在的CPU基本都是多核CPU,服务器更是提供了多核CPU的支持,而每个核也都有自己独立的缓存,当多个核同原创 2022-04-30 01:49:22 · 3094 阅读 · 0 评论 -
大厂必问_什么是进程线程纤程
大厂必问_什么是进程线程纤程什么是进程?从底层角度理解什么是进程什么是线程?从通俗角度理解什么是线程从底层角度理解什么是线程什么是线程切换单核CPU设定多线程是否有意义线程数是不是越大越好?工作线程数(线程池中的线程数)设多少最合适?什么是纤程或协程?什么是程序?什么是进程?从底层角度理解什么是进程如上图是计算机底层的一张图。什么是程序?举个例子,QQ.exe是windows下很普通的可以运行的一个程序,那么怎么去运行它呢?一般来说我们去双击它,它就开始运行,操作系统找到这个可执行文件,所以所谓的程原创 2022-03-16 03:01:44 · 262 阅读 · 0 评论 -
DCL单例到底需不需要volatile?
DCL单例到底需不需要volatile?前言知识介绍对象的创建过程半初始化DCL(Double Check Lock)volatile关键字指令重排序最后前言知识介绍首先我们来看下面一道程序,这道程序很简单,请问这个程序的运行结果是什么?8还是0?public class Escape { private int num = 8; private Escape() { new Thread(() -> System.out.println(this.nu原创 2022-02-27 12:20:54 · 1155 阅读 · 5 评论