Java从小兵到指挥官领兵作战—线程高并发扫盲篇

 前言:学习完java前篇后,基础知识后,并发编程是java高级应用,也是你不得不面对的进阶之路,从多线程开始这条路就开始曲折起来,你可能说我用串行也能够实现一大堆事,但是但是当当一大堆一大堆事来的时候你能够面面俱到,这时候就是需要你的程序代码学会三头六臂处理事务了。

也就是说从java线程开始,你要学会成为一个指挥官,不再是小兵要学会领兵作战.你要学会何时调用什么兵种作战,什么时候停止,什么时候等待,以及战场之大你如何准确通知到你的小兵(信号量),这个时候你的作用相当于一个进程指挥多个线程进行作战,一心多用的时候有可能会搞混,可能东边战地已经收复,可是你还是派了兵去攻打,容易导致“数据脏写”,这让我不禁想到最近BAT很喜欢出的线程题,比如多个线程合作输出,让你输出1-100数字,我们知道线程执行是无序的,假如线程A输出奇数,线程B输出偶数,这样两个交替执行输出1-100思路就是交替进行输出就好了,如何交替进行又是个大问题,当线程执行起来你就无法控制哪个先执行了,这时候才不管你的代码里面串行语句先执行哪个,线程AB哪个先执行都是不一定的,线程的跳脱性就像一个孩子一样,所以我们需要一个信号量和线程锁去通知什么该谁执行,不让谁执行我就把你拷上,到你执行我就打开锁。可以说涉及到线程的面试题都是考到了java高级篇章,如何随心所欲控制好线程,所向披靡带兵作战就需要学习Java并发编程及高并发编程。


【名词扫盲】:

并发:多个任务交替执行——》——》

并行:——》同时执行,只有并行才是真正意义上的同时执行

             ——》

一个CPU只有并发,多核CPU会出现并行

临界区:表示公共资源,名字很高大上,表示线程们争相想要使用的资源。想象一下打印机,只能一段时间处理一个人任务,而不是你打一下我打一下,那么打出来文件就是损坏的,所以临界区资源是受到保护的。

阻塞与非阻塞:Blocking and Non-Blocking 阻塞通常用来描述线程间相互影响。占用资源的线程一直不愿意释放,那么下一个线程就要无限期等待,可以这么理解你派去的旅长A等要负责统领战区A,可是战区A的原来铜铃旅长B不愿意放权,那么就要一直对峙着。

死锁DeadLock、饥饿Starvation、活锁Livelock:

死锁是面试中活跃的问题了。没有一个线程愿意释放自己的资源,所以导致后面线程都无限期等待下午,比如4个旅长都需要交替接任但是没有一个旅长愿意放权。

饥饿:一个旅长被欺负了,很绅士的放权给了接任旅长,结果上任的地方原旅长不走人,导致整个放权的旅长没有领地管辖,部队没有经济来源居无定所就很容易全军饿死。

活锁就是旅长们都太绅士了,都想直接放权走人,结果走的时候遇到接任的旅长,谁都让对方先走,坚决不做第一个过得人,于是就发生了推让的情况,这个在中国人的饭局中体现得比较密切了,抢着买单甚至打起来,哈哈浪费了一大把时间。


根据控制并发的策略可以把并发的级别分类为:阻塞,无饥饿,无障碍,无锁,无等待。

这几个我们将在后续代码实现讲解

原子性:原子性指一个操作不可中断,也就是说一个线程开始不会被其他线程干扰,可以理解原子性=抗干扰性=独立性

可见性:一个线程改了某一个共享变量值,其他线程是否知道

有序性:代码执行是否按顺序执行,不好意思线程并不按写的顺序之执行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值