软件开发进阶技能之编程语言深度运用(三)

简介: 教程来源 https://bslm2020.com/ 本节深入解析并发与异步编程核心:厘清并行/并发、线程/协程本质差异;梳理回调→Promise→async/await演进脉络;详解锁、原子操作、RWMutex等同步机制;剖析数据竞争与死锁成因及规避策略,助开发者安全高效驾驭多核时代。

第三部分:并发与异步编程模型 —— 驾驭多核时代的力量

现代计算机多核处理器普及,充分利用并发和并行是提升程序性能的关键。但并发编程也带来了数据竞争、死锁、线程安全等复杂问题。深度掌握语言的并发模型,能够安全高效地编写并发程序。

3.1 并发的基本概念:并行 vs 并发,线程 vs 协程
并发:多个任务在逻辑上同时执行(交替进行)。

并行:多个任务在物理上同时执行(需要多核)。

线程:操作系统调度的最小单位,切换成本较高(几微秒到几十微秒)。

协程:用户态轻量级线程,由语言运行时调度,切换成本极低(纳秒级),可以创建数十万个。

不同语言提供的并发原语:
image.png
3.2 异步编程模型:回调 → Promise → async/await 的演进
异步编程允许程序在等待I/O时执行其他任务,避免线程阻塞。理解异步模型是编写高响应、高吞吐应用的基础。

示例15:JavaScript的Promise链与async/await

// 模拟异步操作
function fetchUser(id) {
    return new Promise(resolve => {
        setTimeout(() => resolve({ id, name: `User${id}` }), 100);
    });
}

function fetchPosts(userId) {
    return new Promise(resolve => {
        setTimeout(() => resolve([`Post1 by ${userId}`, `Post2 by ${userId}`]), 100);
    });
}

// Promise链式调用
fetchUser(1)
    .then(user => {
        console.log(user.name);
        return fetchPosts(user.id);
    })
    .then(posts => {
        console.log(posts);
    })
    .catch(err => console.error(err));

// async/await 更清晰的写法
async function displayUserContent(id) {
    try {
        const user = await fetchUser(id);
        console.log(user.name);
        const posts = await fetchPosts(user.id);
        console.log(posts);
    } catch (err) {
        console.error(err);
    }
}
displayUserContent(2);

深度解释:async函数返回一个Promise,await会暂停当前函数的执行,直到Promise完成,但不会阻塞事件循环。这比回调地狱(Callback Hell)可读性高得多。

示例16:Python的asyncio实现并发网络请求

import asyncio
import aiohttp

async def fetch_url(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = [
        'http://example.com',
        'http://example.org',
        'http://example.net',
    ]
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_url(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        for url, html in zip(urls, results):
            print(f"{url}: {len(html)} bytes")

asyncio.run(main())

关键点:asyncio.gather并发执行多个协程。在等待网络响应时,事件循环可以切换到其他协程,实现高效I/O并发。

3.3 多线程同步:锁、原子操作、并发集合
当多个线程共享可变状态时,必须使用同步机制来保证数据一致性。

示例17:Java中的线程安全计数器比较

// 非线程安全
class UnsafeCounter {
    private int count = 0;
    public void increment() { count++; }  // 多线程下丢失更新
    public int get() { return count; }
}

// 使用synchronized
class SynchronizedCounter {
    private int count = 0;
    public synchronized void increment() { count++; }
    public synchronized int get() { return count; }
}

// 使用AtomicInteger(无锁CAS)
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
    private AtomicInteger count = new AtomicInteger(0);
    public void increment() { count.incrementAndGet(); }
    public int get() { return count.get(); }
}

// 使用LongAdder(高并发下更好)
import java.util.concurrent.atomic.LongAdder;
class AdderCounter {
    private LongAdder count = new LongAdder();
    public void increment() { count.increment(); }
    public long get() { return count.sum(); }
}

性能对比:synchronized适合低竞争场景;AtomicInteger基于CAS,没有锁的开销,但在高竞争下可能自旋;LongAdder通过分段计数进一步减少竞争。进阶开发者会根据场景选择合适的同步工具。

示例18:Go的Mutex和RWMutex

type SafeCounter struct {
    mu sync.Mutex
    m  map[string]int
}

func (c *SafeCounter) Inc(key string) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.m[key]++
}

func (c *SafeCounter) Value(key string) int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.m[key]
}

// 读多写少场景使用RWMutex,允许并发读
type SafeMap struct {
    mu sync.RWMutex
    m  map[string]string
}

func (s *SafeMap) Get(key string) string {
    s.mu.RLock()
    defer s.mu.RUnlock()
    return s.m[key]
}

3.4 数据竞争与死锁的检测与避免
数据竞争:多个线程同时访问同一内存位置,至少有一个是写操作,且没有同步。Go语言内置了数据竞争检测器:go test -race。

死锁:两个或多个线程互相等待对方持有的锁,导致永久阻塞。

示例19:Java死锁示例及解决方法

public class DeadlockDemo {
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public void method1() {
        synchronized(lock1) {
            sleep(100);  // 模拟工作
            synchronized(lock2) {
                System.out.println("method1 done");
            }
        }
    }

    public void method2() {
        synchronized(lock2) {
            sleep(100);
            synchronized(lock1) {
                System.out.println("method2 done");
            }
        }
    }

    private void sleep(int ms) { try { Thread.sleep(ms); } catch(Exception e) {} }

    public static void main(String[] args) {
        DeadlockDemo demo = new DeadlockDemo();
        new Thread(demo::method1).start();
        new Thread(demo::method2).start();
    }
}

避免死锁的原则:

固定锁顺序:总是以相同的顺序获取锁。例如,总是先获取lock1再获取lock2。

使用超时尝试:tryLock(timeout)(Java),如果获取失败则释放已持有的锁并重试。

减少锁粒度:使用并发集合(ConcurrentHashMap)或无锁数据结构。

使用更高级的同步工具:如java.util.concurrent的Semaphore、CountDownLatch等。
来源:
https://zlpow.cn/

相关文章
|
16天前
|
人工智能 弹性计算 API
OpenClaw+阿里云百炼Token Plan 一站式部署与配置流程
OpenClaw作为一款开源可自托管的AI智能体执行框架,能让大模型从单纯对话升级为可执行文件处理、代码编写、流程自动化等任务的数字助手。在阿里云上部署OpenClaw并接入百炼Token Plan,可依托阿里云稳定的云服务与百炼的大模型能力,打造专属、高效、低成本的AI智能体服务。本文将从准备工作、阿里云服务器部署、百炼Token Plan开通与密钥获取、OpenClaw配置、功能验证到常见问题排查,提供完整实操流程,帮助用户快速完成部署与配置。
177 9
|
15天前
|
人工智能 Cloud Native 架构师
2026年全网主流AI编程工具深度横评 赋能研发效能全面升级与工程化落地
当下,整个软件工程行业正式迈入AI原生发展新阶段,AI编程工具不再是锦上添花的辅助插件,而是技术团队突破研发效能瓶颈、简化工程化落地流程的核心生产力工具。知名咨询机构麦肯锡发布的2026软件研发效能白皮书明确指出,全面引入前沿智能编码代理工具的技术团队,人均代码吞吐量相比传统研发模式提升35%以上,代码调试周期、项目交付周期也得到显著压缩。面对市场上品类繁多、功能定位各异的智能编码产品,如何结合自身业务场景、团队架构、合规要求挑选适配工具,成为企业技术管理者、架构师与一线开发者共同关注的问题。本文结合云原生架构落地、大型项目重构、数据安全合规、多任务协同等真实研发场景,对2026年五款主流AI
1330 0
|
2月前
|
存储 人工智能 自然语言处理
2026年阿里云新老用户最新优惠活动:云服务器活动、免费试用活动、AI产品活动参考
阿里云2026新老用户优惠活动涵盖三大板块。云服务器方面,轻量应用服务器低至38元/年,经济型e实例99元/年,u1实例199元/年,限时限量抢购。免费试用方面,新老用户可领最高200元试用点,AI产品免费提供7000万+大模型tokens及30+款产品体验,140+云产品最长12个月免费试用。AI产品方面,百炼Token Plan支持多模型切换、多档套餐;HappyHorse视频生成模型限时8折;OpenClaw一键部署低至9.9元起。此外还提供折扣券、学生无门槛券、算力补贴等多类优惠券,整体以"普惠基础设施+零成本体验+智能化赋能"策略,全面降低上云与用AI门槛。
2026年阿里云新老用户最新优惠活动:云服务器活动、免费试用活动、AI产品活动参考
|
6月前
|
数据采集 人工智能 安全
智能体来了从 0 到 1:重新定义企业的人机协作模式
本文系统阐述智能体如何推动人机协作从“工具辅助”迈向“协同共生”,破解传统协作的效率、成本与能力瓶颈;提出分工、流程、能力三大重构方向,给出“场景筛选—角色定位—低代码搭建—试点迭代—全面推广”五步落地路径,并结合制造、金融、服务等行业案例,提供组织适配与避坑指南,助力企业实现数字化转型新突破。
456 3
|
2月前
|
人工智能 监控 算法
AI智能体的开发及上线
本文详解AI智能体从0到1的标准化开发与合规上线闭环:涵盖架构设计(大脑/规划/记忆/工具/感知)、低代码/代码级开发路径、RAG知识增强、算法备案、内容安全与数据脱敏等2026最新监管要求,助力高效、合规落地。
|
3月前
|
存储 人工智能 机器人
零代码低成本!阿里云一键部署OpenClaw实操教程
还在为部署OpenClaw发愁?阿里云推出官方一键镜像,零代码快速部署!新用户首月仅9.9元享2核4G服务器,叠加7000万免费Token,轻松“养龙虾”——即刻拥有可联网、能执行、会记忆的专属AI助理!
584 10
零代码低成本!阿里云一键部署OpenClaw实操教程
|
3月前
|
机器学习/深度学习 人工智能 运维
高压电线电力巡检六类图像识别数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含2000张高压输电线路巡检图像,涵盖电缆破损、绝缘子破损、正常电缆/绝缘子、杆塔、植被遮挡共6类,YOLO格式标注,已划分train/val/test,开箱即用,专为YOLO系列目标检测任务优化,助力智能电力巡检研发与落地。(239字)
483 6
|
8月前
|
存储 人工智能 运维
集之互动推出AIGC视频全栈解决方案,“陪跑模式”解决企业内容生产难题
集之互动正式推出其“服务+培训+定制系统”的AIGC视频全栈解决方案,旨在通过“AI战略合作伙伴”式的陪跑服务,解决企业在视频内容生产中面临的高成本、长周期、安全合规及技术落地难等核心痛点。
298 5
|
3月前
|
Ubuntu Linux 网络安全
对时服务器技术教程:从配置到实战
本文参考http://gnifd.cn详解NTP对时服务器的配置与实战:涵盖Ubuntu下NTP服务部署、Python(ntplib)时间同步示例、常见问题排查(如服务启动失败、同步不准)、防火墙配置及进阶方向(分布式时间同步、安全性等),助力构建精准可靠的时间基础设施。(239字)
|
4月前
|
JSON JavaScript 安全
【开源剪映小助手-客户端】Node.js 集成
本文系统介绍 capcut-mate 桌面端 Node.js 与 Electron 的安全集成方案:采用“主进程+预加载桥接+渲染进程”三层架构,通过 contextBridge 有限暴露 API,实现下载管理、文件操作、日志记录及新增的跨平台目录扫描(triggerDirectoryScan)功能,助力 Adobe Premiere Pro 自动识别新草稿。