多线程(1)——多线程基础

一、了解多线程

1.多线程和进程的区别

  1. 进程是程序执行的基本单位,线程是运算的最小单位。
  2. 每建立一个进程系统会给它分配独立的地址空间,而线程共用一个相同的地址空间。
  3. 因为每一个进程有独立的地址空间所以,进程有较高的安全性。一个进程的崩溃不会影响其他进程。而一个线程死掉就等于全部进程死掉。

下面是我在《Java高并发程序设计》——葛一鸣著 中看到的一个例子,有助于理解线程和进程的区别。
简单地说进程是一个容器。比如一件漂亮的小别墅。别墅里有电视、厨房、洗手间等(进程占有的资源)。当一家三口住在一起时(相当于三个线程),有时候可能会有些小冲突,比如,当女儿要看动画片时,爸爸就不能看体育频道了(相当于线程间资源竞争),当然大部分时间线程间还是协作关系,比如妈妈在厨房为爸爸和女儿做饭,爸爸在书房工作赚钱养家糊口,女儿在写作业,大家就其乐融融了。此时这个进程也就在健康的执行。
2.多线程的状态
这里写图片描述

二、多线程的一些常见概念

并发和并行

  • 并发偏重于多个任务交替执行。
  • 并行的多个任务才是真正意义上的同时执行。

临界区

临界区用来表示一种公共资源或者共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界区被占用其他资源想要占用这个 资源,就必须等待。

死锁(Deadlock)、活锁(Starvation)、饥饿(Livelock)

这里写图片描述
死锁的问题就像这四辆小汽车,彼此之间相互占用了其他车辆的车道,如果大家都不愿意释放自己的车道,这个状态将永远维持下去。
活锁则是向我们日常生活中出电梯,但不巧的是门外有个人挡住你的去路,这是你们都绅士的给对方让路,结果你们有撞上了。于是乎在反复几次后你们最终顺利通过。
饥饿是指一个或多个线程因为某种原因而无法获得资源。比如他的优先级太低,而高优先级不断抢占它的资源;或者是某一个线程一直占着资源不放,导致其它需要这个资源的线程无法正常执行。

并发级别 阻塞、无饥饿、无障碍、无锁、无等待

两个重要定律

1.Amdahl
加速比=优化前系统耗时/优化后系统耗时
加速比=1/(F+1/n(1-F)))
n表示处理器个数,F表示程序中只能串行执行的比例。
2.Gustafson
加速比=执行时间/总执行时间
加速比=n-F(n-1)
两个定律前者强调:当串行比例一定时,加速比是有上限的,不管你堆叠多少个CPU,都不可能突破这个上限。比如一开车去60公里外的地方,你用一小时行驶了30公里,那么你接下来无论如何都不可能达到90公里/小时。
后者强调如果被执行的代码比重做够多,那么加速比就能随着CPU数量线性增长。
比如前一个问题,给你足够的时间和距离,你总有一天可以达到90公里/小时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值