来源:互联网 更新时间:2026-06-15 07:39
先来捋一捋并行编程里那些绕不开的基础概念。很多初学者一上来就被术语搞晕,其实拆开看,没想象中那么玄乎。

所谓临界区,就是一块被多个线程共享的资源,比如一个计数器、一个共享列表。规矩只有一个:同一时刻只能有一个线程进去操作。其他线程如果也想用,就得乖乖排队等着。
在并行程序里,保护临界区资源是头等大事。要是没保护好的话,数据就乱套了。
这两个词描述的是线程之间的“干扰度”。
synchronized 或可重入锁。
这三兄弟都属于“活跃性”问题——说白了就是线程能不能正常跑下去。
前面说过,阻塞就是线程被挂起直到资源释放。比如用 synchronized 或可重入锁。缺点很明显——容易饿死人。
用公平锁就能解决饥饿问题——按顺序来,谁先排队谁先得。但本质上还是阻塞策略,只是让排队更公平。
这是最弱的非阻塞方案:线程可以自由进入临界区,但一旦发现有别人同时在改数据,就立刻回滚重试。一种常见实现是借助“一致性标记”——线程操作前先记下标记,操作完再检查标记有没有变,变了就重来。
问题也很明显:冲突一多,大家不断回滚,谁都没法正常走完。
在无障碍的基础上加了一条规定:必须保证至少有一个线程能在有限步数内成功退出。常见的CAS循环就是典型例子:
// 如果修改不成功,那么循环永远不会停止
while(!atomicVar.compareAndSet(localVar, localVar + 1)){
localVar = atomicVar.get();
}
但这里也有隐患——如果CAS一直失败,某些线程可能永远循环下去,类似于饥饿。
在无锁的基础上再加码:所有线程都必须在有限步数内完成,彻底杜绝饥饿。如果限制步数上限,还可以分出“有界无等待”和“线程数无关的无等待”。
典型的例子是RCU(Read-Copy-Update):读线程完全不受限制,写线程先复制一份数据副本,在副本上修改,等时机成熟了再整体替换。
加速比 = 优化前耗时 / 优化后耗时。公式如下:
Tn = T1(F + (1-F)/n) = 1 / (F + (1-F)/n)
其中n是CPU数量,F是程序中串行执行的比例。结论很明确:即使CPU无限多,加速比也受限于串行比例F。想跑得更快,光加CPU是不够的,关键是要把并行比例拉上去。
换个角度看:串行时间 = a,并行时间 = b,总时间 = a + b,串行比例 F = a / (a + b)。那么:
S(n) = (a + nb) / (a + b) = F + n(1-F)
结论:如果串行比例很小,加速比基本就等于处理器个数。只要持续堆CPU,速度就能线性增长。
两个定律没啥矛盾,只是视角不同:Amdahl强调的是在串行比例固定时,加速比有天花板;Gustafson则强调,只要并行比例足够大,堆CPU就很有效。串行比例为1时,怎么搞加速比都是1;串行比例为0时,加速比就是n。
JMM就是一套规则,保证多个线程能有效、正确地配合工作。核心围绕着三个特性——原子性、可见性、有序性来展开。
指一个操作一旦开始,就不会被其他线程打断,整体不可拆分。举个反例:在32位系统上,long型数据的读写就不是原子性的——因为long占64位,一次读写可能只改了半截。
当一个线程修改了共享变量,其他线程能不能立即感知到?不一定。缓存优化、编译器优化、硬件优化、指令重排……这些都可能让修改“延迟”甚至“失效”。
为了提高性能,CPU可能会打乱指令的执行顺序——这叫指令重排。重排之后,单线程内的逻辑不会出错(遵守Happen-Before规则),但在多线程环境下,可能就乱套了。
// 如果不加volatile,线程ReadT已经读到ready为false,
// 当主线程修改ready为true后,ReadT并不知道,将一直循环下去。
private static volatile boolean ready;
private static int number = 0;
public static class ReadT extends Thread {
@Override
public void run() {
while (!ready);
System.out.println(number);
}
}
public static void main(String[] args) throws InterruptedException {
new ReadT().start();
Thread.sleep(1000);
number = 42;
ready = true;
}
volatile 能保证可见性,但不能保证原子性。它能禁止指令重排序(保证一定的有序性),但仅限于它修饰的变量前后。而 synchronized 则能同时保证原子性、可见性和有序性。
这是指令重排必须遵守的“底线规则”,确保重排后单线程语义不变:
《Off Campus》第二季官宣:这对CP还在,但不再是主角
和平精英如何做到压枪稳-和平精英怎样才能压枪稳
客单价碾压宝马奥迪!极氪5月交付新车34377辆:连续4个月双增长
免费影视剧APP推荐
HBO 奇幻剧《龙之家族》第三季定档 6 月 22 日,最终预告片曝光喉道海战
DOTA2 TI时隔七年重返上海!门票6月10日开抢,国服享受优先购买!
网络热词聊污是什么意思
帅气继父网名女生可爱英文(精选100个)
抖音最火沙雕男生网名(精选100个)
蒙古上单是什么梗
免费看电影的软件推荐
韦一敏是什么梗
金铲铲之战s17六暗星卡莎阵容玩法构筑指南
SpaceX狂揽AI人才,马斯克亲自面试且不看简历背景
作家助手如何上传自制封面 作家助手如何设置小说的封面
阿里发布Qwen3.7-Max大模型,全球第五、国产第一
有寓意的易经网名男生(精选100个)
韩漫小少爷网名大全女生(精选100个)
美国市场:股票相对债券的风险溢价正在消失
动漫《情色漫画老师OVA》剧情介绍
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc