学习笔记之多线程与高并发
这个是我学习马士兵大学课程的笔记,多线程与高并发部分是马老师亲自上阵,讲的很棒.
前言
时代在不断发展,技术也是日新月异,所以我们就要不断学习进步,才能赶上时代的步伐,尤其是我们程序员.
传统普通开发,想跳出舒适圈,向前迈一步的话,需要掌握一些"上天入地"的知识:
“上天”:高并发,缓存,大流量,大数据量;
“入地”:JVM,OS,算法,线程,IO.
本JAVA多线程与高并发系列对一些概念上的论述不是特别准确,多是从应用角度上便于理解的一种方式.
多线程与高并发系列的大纲:
目录
- 主线
- JAVA多线程与高并发(一)[线程概念,同步synchronize关键字]
- JAVA多线程与高并发(二)[volatile,CAS(无锁优化,自旋锁,乐观锁-AtomicXX,XXAdder)]
- JAVA多线程与高并发(三)[ReentrantLock,ReadWriteLock,CountdownLatch,CyclicBarrier,Phaser,Semaphore,Exchanger]
- JAVA多线程与高并发(四)[LockSupport,AQS解读]
- JAVA多线程与高并发(五)[ThreadLocal,强软弱虚引用]
- JAVA多线程与高并发(六)[常用容器CopyOnWriteList,ConurrentHashMap,各种BlockingQueue,PriorityQueue,TransferQueue]
- JAVA多线程与高并发(七)[线程池的基本概念,ThreadPoolExecutor的简单使用和源码解读]
- JAVA多线程与高并发(八)[Executors线程工厂,ForkJoinPoll分叉汇总(MapReduce)]
- JAVA多线程与高并发(九)[JMH入门了解,Disrupter]
- 番外篇
- JAVA-volatile修饰引用类型变量,能否保证其属性的可见性?
- JAVA多线程与高并发-三道道常见的面试题(基于一到六节)
- 线程池如果不用了没有关闭,会导致内存溢出和资源浪费吗?
to be continued…
什么是并发,并发&并行的区别是啥?
可以这么理解
- 并发:几件事情是穿插着一起执行的,而不是一件事情专心干完后才能再去专心干另一件事.能不能并发与CPU的核心数无关,单核CPU也可以实现并发。
比如我在吃火锅,有两个任务,任务一:吃一筐青菜,任务二:吃一筐肉,我是吃一口青菜,吃一口肉,这样交替着吃(当然也有可能有时候吃两口青菜再吃一口肉),全吃完啦没有浪费.那么可以说,我是并发的完成了这两个任务.
如果你问我为啥这么干呢?因为肉熟的速度比较慢,菜熟的比较快,那么我为了提高吃的效率,交替着吃比按顺序吃完菜再吃肉要快很多.
还有,我一边吃着火锅,一边唱着歌,这两个任务也是并发执行的.我为啥这么干呢?
图个高兴 业务需要嘛!
- 并行:几件事情同时执行,强调一个同时.只有当CPU至少有两个核心的时候或者操作系统有两个CPU时才有可能并行.
比如我在吃火锅,同时在听着音乐,同时脚还打着节拍,这几个任务是"同时"发生的.
深入理解计算机系统中说:
- 并发(Concurrency)是说进程B的开始时间是在进程A的开始时间与结束时间之间,我们就说A和B是并发的。
- 并行(Parallel Execution)是并发的真子集,指同一时间两个进程运行在不同的机器上或者同一个机器不同的核心上。
简书网友说:
-
并发指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
-
并行指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的