展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Java多线程与并发完整代码详解

Java多线程与并发完整代码详解

多线程提升资源利用率和响应速度,但增加设计与调试复杂度。线程创建推荐实现Runnable接口。线程安全依赖互斥同步,synchronized保证原子性与可见性。线程通信通过wait/notify实现协作,需避免死锁与饥饿。固定加锁顺序可有效防止死锁。

本文目录

    一、多线程基础:优缺点与核心代价

    1. 核心优点

    • 资源利用率更高:CPU空闲时可调度其他线程执行,避免硬件资源浪费(比如IO等待时CPU不闲置)。

      Ja va多线程与并发完整代码详解

    • 程序设计更简洁:异步场景(如文件下载、接口调用)可通过多线程拆分任务,简化复杂逻辑。

    • 程序响应更快:UI界面、服务端程序可通过多线程避免主线程阻塞,提升用户或调用方的体验。

    2. 主要代价(那些容易被忽略的细节)

    • 设计复杂度上升:需要处理线程安全、同步、死锁、线程通信等问题,调试难度因此增加。

    • 上下文切换开销:线程切换时需保存和恢复线程上下文(栈、寄存器等),这会消耗CPU资源。高频切换对性能的影响相当可观。

    • 额外资源消耗:每个线程都需要占用栈内存(默认1M左右)和内核对象,线程数量过多时,内存溢出(OOM)的风险会直线上升。

    二、线程创建与启动(关键细节补全)

    1. 两种标准实现方式

    方式1:继承Thread类

    class MyThread extends Thread {
        @Override
        public void run() { 
            // 线程执行的业务逻辑(线程体)
        }
    }
    // 启动线程:调用start(),而非run()
    new MyThread().start();
    

    方式2:实现Runnable接口(推荐)

    class MyTask implements Runnable {
        @Override
        public void run() {
            // 线程执行的业务逻辑(解耦:任务与线程分离)
        }
    }
    // 启动线程:将任务传入Thread实例
    new Thread(new MyTask()).start();
    

    2. 选型建议

    优先选择实现Runnable接口,原因如下:

    • 解耦:任务逻辑(Runnable)与线程控制(Thread)分离,便于复用和维护。

    • 适配高级特性:线程池、Future等JUC工具类仅支持Runnable接口,可以降低后续的扩展成本。

    • 规避单继承限制:Ja va是单继承语言,继承Thread会占用唯一的继承名额,影响类的扩展性。

    3. 经典错误(务必牢记)

    调用run()方法而非start():

    直接调用run()只是普通方法调用(运行在当前线程),不会启动新线程;start()才会触发JVM创建新线程,执行run()方法。
    

    三、线程安全核心:竞态条件与临界区

    1. 核心概念

    • 竞态条件:多线程竞争同一共享资源时,执行结果依赖线程的执行顺序。比如多线程自增同一个变量,结果可能小于预期值。

    • 临界区:导致竞态条件的代码片段,也就是多个线程共享资源并可能修改资源的代码块。

    2. 本质原因

    共享资源的“读-改-写”复合操作非原子性。以count++为例,它实际分为3步:读count值→自增→写回count。多线程交错执行时,数据错乱就不可避免。

    四、线程安全判定:线程控制逃逸规则(重点)

    核心判定原则:若一个资源(对象、文件、数据库连接等)的创建、使用、销毁,全程在同一个线程内完成,且不会逃逸到线程外部(即其他线程无法访问该资源),则该资源的使用是线程安全的。

    1. 天生线程安全的场景

    • 局部基本变量:存储在线程私有栈中,不共享,天然安全(比如方法内的int、boolean变量)。

    • 局部对象引用(无逃逸):对象本身在堆内存(共享区域),但引用仅存在于当前线程栈,且未通过返回值、参数传递等方式暴露给其他线程,线程安全。

    2. 天生线程不安全的场景

    对象成员变量存储在堆内存,多线程可通过对象引用访问并修改。若未加同步,必然存在线程安全问题。

    五、不可变性与线程安全(细节补全)

    • 核心结论:只读共享的资源不会产生线程安全问题;不可变对象(状态一旦创建就无法修改)天然线程安全(如String、Integer等包装类)。

    • 关键提醒:不可变对象的引用不一定安全!例如:AtomicReference ref = new AtomicReference<>("a");,ref引用本身可被多线程修改(需用原子类保护),但引用指向的String对象本身不可变。

    六、synchronized同步机制(核心,笔记细节补全)

    synchronized是Ja va原生的悲观锁,通过“互斥”保证临界区原子性,同时保证可见性(解锁前的修改对后续加锁线程可见)和可重入性。

    1. 四种作用范围(附实例与锁对象)

    作用范围锁对象实例代码说明
    实例方法同步当前对象(this)public synchronized void add(int value) { … }同一对象的多个同步实例方法,同一时刻仅一个线程可执行
    静态方法同步当前类的Class对象(全局唯一)public static synchronized void add(int value) { … }同一类的所有静态同步方法,同一时刻仅一个线程可执行
    实例方法中同步块自定义对象(常用this)synchronized(this) { this.count += value; }缩小同步范围,仅保护临界区,提升性能
    静态方法中同步块当前类的Class对象synchronized(MyClass.class) { … }与静态同步方法锁对象一致,可灵活控制同步范围

    2. 核心特性(务必牢记)

    • 可重入性:同一线程可重复获取同一把锁(如同步方法调用另一个同步方法,不会死锁)。

    • 互斥性:同一时刻,仅一个线程能持有锁并进入临界区。

    • 可见性:线程解锁前,对共享变量的修改会强制刷新到主内存,后续加锁线程会从主内存读取最新值。

    • 非公平性:线程唤醒后会随机竞争锁,不保证请求顺序(默认非公平,性能更优)。

    七、线程间通信(重点:wait/notify/notifyAll)

    线程间通信的核心是“协作”(如生产者-消费者模型),常用方式包括共享对象通信、忙等待、wait/notify/notifyAll,后者是推荐做法。

    1. 共享对象通信(基础)

    通过共享对象的成员变量传递信号,需配合同步,避免竞态条件。例如:线程A在同步块中设置hasDataToProcess = true,线程B在同步块中读取该变量。

    2. 忙等待(不推荐)

    线程B循环等待信号,浪费CPU资源(空闲时也占用CPU):

    while(!sharedSignal.hasDataToProcess()){
        // 空循环,忙等待,浪费CPU
    }
    

    3. wait()、notify()、notifyAll()(核心,细节补全)

    强制规则(违反会抛出IllegalMonitorStateException)

    必须在synchronized同步块或方法中调用,且调用对象必须是“当前持有锁的对象”(即同步块的锁对象)。

    核心机制(容易混淆的点)

    • wait():线程释放持有的锁,进入该锁的等待队列,变为非运行状态,直到被notify()或notifyAll()唤醒。

    • notify():随机唤醒等待队列中的一个线程。唤醒后需重新竞争锁,才能进入临界区。

    • notifyAll():唤醒等待队列中的所有线程。所有线程竞争锁,依次进入临界区。

    关键疑问解答

    问:等待线程持有锁,会阻塞唤醒线程进入同步块吗?

    答:不会。线程调用wait()后,会立即释放锁,允许其他线程(包括唤醒线程)获取锁并进入同步块;唤醒线程执行完同步块、释放锁后,被唤醒的线程才会竞争锁,成功后退出wait()。
    

    4. 常见问题与解决方案(务必牢记)

    问题原因解决方案
    丢失信号notify()先于wait()执行,信号未保存,等待线程错过唤醒用成员变量保存信号(如boolean wasSignalled),唤醒时置为true,等待时检查该变量
    假唤醒线程被唤醒但未收到有效信号(JVM底层机制)用while循环检查信号(而非if),即“自旋锁”:while(!wasSignalled) { wait(); }
    意外唤醒用常量字符串、全局对象作为锁,JVM会复用该对象,导致跨实例唤醒使用唯一锁对象(如new Object()),避免使用“”、Class对象等全局共享对象

    正确实现示例(避免所有问题)

    public class MyWaitNotify {
        private final Object monitor = new Object(); // 唯一锁对象
        private boolean wasSignalled = false; // 保存信号,避免丢失
    
        // 等待信号
        public void doWait() throws InterruptedException {
            synchronized (monitor) {
                while (!wasSignalled) { // while循环,防止假唤醒
                    monitor.wait();
                }
                wasSignalled = false; // 清除信号,准备下次等待
            }
        }
    
        // 发送信号
        public void doNotify() {
            synchronized (monitor) {
                wasSignalled = true; // 保存信号
                monitor.notify(); // 唤醒等待线程
            }
        }
    }
    

    八、死锁(核心:原因与避免)

    1. 定义

    两个或多个线程互相持有对方需要的锁,且永久阻塞,无法继续执行。简单说,就是线程“互相僵持”。

    2. 典型场景(务必牢记)

    • 基础场景:线程1锁A→等B,线程2锁B→等A,互相阻塞。

    • 代码场景(TreeNode示例):线程1调用parent.addChild(child)(锁parent),线程2调用child.setParent(parent)(锁child),后续线程1需锁child、线程2需锁parent,导致死锁。

    • 数据库场景:多个事务更新相同记录,顺序相反(事务1锁记录1→等记录2,事务2锁记录2→等记录1)。

    3. 死锁产生的4个必要条件(缺一不可)

    • 互斥:锁资源只能被一个线程持有。

    • 持有并等待:线程持有一个锁,同时等待另一个锁。

    • 不可剥夺:线程持有锁时,不能被其他线程强制剥夺。

    • 循环等待:多个线程形成“互相等待锁”的循环链。

    4. 避免死锁的3种核心策略(重点)

    策略1:固定加锁顺序(最常用、最易实现)

    所有线程按相同顺序获取锁(如先锁A、再锁B),打破“循环等待”条件。

    策略2:加锁时限

    尝试获取锁时设置超时时间(如用Lock.tryLock(long timeout, TimeUnit unit)),超时则释放已持有锁并回退,等待随机时间后重试,打破“持有并等待”条件。

    策略3:死锁检测

    适用于无法固定加锁顺序、超时不可行的场景:

    • 用数据结构(如Map、有向图)记录线程持有和请求的锁。

    • 线程请求锁失败时,遍历锁关系图,检测是否存在循环(死锁)。

    • 检测到死锁后,释放所有锁、回退重试,或按优先级让部分线程回退。

    九、饥饿与公平性

    1. 核心概念

    • 饥饿:线程长期得不到CPU运行时间或锁资源,最终“饥饿致死”(如低优先级线程被高优先级线程长期抢占CPU)。

    • 公平性:所有线程公平获取资源(按请求顺序获取),避免饥饿。

    2. Ja va中导致饥饿的3个原因

    • 高优先级线程吞噬低优先级线程的CPU时间(Ja va优先级1-10,优先级越高的线程被调度概率越高)。

    • 线程永久阻塞在同步块外(非公平锁下,新线程可能持续抢占锁,老线程一直等待)。

    • 线程等待一个永久无法完成的对象(如等待一个永远不会被notify()的对象)。

    3. 实现公平性的方案

    用Lock锁替代synchronized(synchronized默认非公平),自定义公平锁或使用JUC的公平锁(如ReentrantLock(true)):

    • 公平锁会维护一个等待队列,解锁后仅唤醒队列头部的线程,保证请求顺序。

    • 注意:公平锁性能低于非公平锁(需要维护队列、切换线程),仅在需要避免饥饿时使用。

    十、Ja va中的锁(进阶,笔记细节补全)

    1. 简单锁的实现(理解原理)

    核心是用“状态变量+同步”控制线程访问,示例(不可重入锁):

    public class Lock {
        private boolean isLocked = false; // 锁状态
    
        // 获取锁(阻塞)
        public synchronized void lock() throws InterruptedException {
            while (isLocked) { // 自旋,防止假唤醒
                wait();
            }
            isLocked = true; // 标记为锁定状态
        }
    
        // 释放锁
        public synchronized void unlock() {
            isLocked = false;
            notify(); // 唤醒等待线程
        }
    }
    

    2. 锁的可重入性(重点)

    定义

    同一线程可重复获取已持有的锁(synchronized、ReentrantLock均支持可重入),示例:

    public class ReentrantDemo {
        // 两个同步方法,锁对象都是this
        public synchronized void outer() { inner(); }
        public synchronized void inner() { /* 业务逻辑 */ }
    }
    

    可重入锁的实现要点

    需记录“持有锁的线程”和“重入次数”,修改后的可重入锁示例:

    public class ReentrantLock {
        private boolean isLocked = false;
        private Thread lockedBy = null; // 持有锁的线程
        private int lockedCount = 0; // 重入次数
    
        public synchronized void lock() throws InterruptedException {
            Thread currentThread = Thread.currentThread();
            // 若锁被占用,且不是当前线程持有,阻塞
            while (isLocked && lockedBy != currentThread) {
                wait();
            }
            isLocked = true;
            lockedCount++;
            lockedBy = currentThread;
        }
    
        public synchronized void unlock() {
            // 仅持有锁的线程可释放
            if (Thread.currentThread() != lockedBy) {
                throw new IllegalMonitorStateException("未持有锁,无法释放");
            }
            lockedCount--;
            // 重入次数为0时,才释放锁
            if (lockedCount == 0) {
                isLocked = false;
                lockedBy = null;
                notify();
            }
        }
    }
    

    3. 关键注意点:finally中调用unlock()

    用Lock锁时,临界区可能抛出异常,需要在finally中释放锁,避免锁泄露(锁永久被占用):

    lock.lock();
    try {
        // 临界区(可能抛出异常)
    } finally {
        lock.unlock(); // 确保无论是否异常,都释放锁
    }
    

    十一、读写锁(ReentrantReadWriteLock)

    1. 核心场景

    适用于“读多写少”的场景(如缓存查询、配置读取),解决“读-读互斥”的性能问题。核心原则是:

    读-读共存、读-写互斥、写-写互斥。
    

    2. 简单实现(理解原理)

    public class ReadWriteLock {
        private int readers = 0; // 读线程数量
        private int writers = 0; // 写线程数量
        private int writeRequests = 0; // 写请求数量(优先写)
    
        // 获取读锁
        public synchronized void lockRead() throws InterruptedException {
            // 有写线程或写请求,阻塞(优先写)
            while (writers > 0 || writeRequests > 0) {
                wait();
            }
            readers++;
        }
    
        // 释放读锁
        public synchronized void unlockRead() {
            readers--;
            notifyAll(); // 唤醒等待的写线程
        }
    
        // 获取写锁
        public synchronized void lockWrite() throws InterruptedException {
            writeRequests++;
            // 有读线程或写线程,阻塞
            while (readers > 0 || writers > 0) {
                wait();
            }
            writeRequests--;
            writers++;
        }
    
        // 释放写锁
        public synchronized void unlockWrite() {
            writers--;
            notifyAll(); // 唤醒所有等待的读/写线程
        }
    }
    

    3. 读写锁的可重入性(笔记补全)

    上述简单实现不可重入,会导致死锁(如持有写锁的线程再次请求写锁、持有读锁的线程再次请求读锁),需要优化:

    • 读锁重入:用Map记录线程及读锁重入次数,已持有读锁的线程可再次获取读锁(无论是否有写请求)。

    • 写锁重入:记录持有写锁的线程及重入次数,已持有写锁的线程可再次获取写锁。

    • 锁降级:持有写锁的线程可直接获取读锁(无需释放写锁),避免写锁释放后被其他线程抢占。

    十二、信号量(Semaphore)

    1. 核心作用

    控制并发线程数量(如限流、连接池控制),可以看作是“可计数的锁”。JUC中已提供ja va.util.concurrent.Semaphore,无需自定义。

    2. 核心特性

    • 可计数:允许同时获取多个许可(如permits=5,可同时有5个线程获取许可)。

    • 有上限:可设置最大许可数(如上限10,超过则阻塞)。

    • 可当作锁:当permits=1时,等价于非公平锁(控制单个线程进入临界区)。

    3. 常用示例(限流)

    // 上限3个线程同时执行
    Semaphore semaphore = new Semaphore(3);
    for (int i = 0; i < 10; i++) {
        new Thread(() -> {
            try {
                semaphore.acquire(); // 获取许可(阻塞,直到有空闲许可)
                // 临界区(如接口调用、资源操作)
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release(); // 释放许可
            }
        }).start();
    }
    

    十三、阻塞队列(BlockingQueue)

    1. 核心区别(与普通队列)

    当队列空时,获取元素(take())会阻塞;当队列满时,添加元素(put())会阻塞。无需手动处理线程同步,因为内部已经实现了。

    2. 核心作用

    实现生产者-消费者模型(解耦生产者和消费者,平衡两者速度),是线程池底层的核心组件(用于缓存任务)。

    3. 简单实现(理解原理)

    public class BlockingQueue {
        private final List queue = new LinkedList<>();
        private final int limit; // 队列最大容量
    
        public BlockingQueue(int limit) {
            this.limit = limit;
        }
    
        // 入队(满则阻塞)
        public synchronized void enqueue(Object item) throws InterruptedException {
            while (queue.size() == limit) {
                wait(); // 队列满,阻塞生产者
            }
            if (queue.size() == 0) {
                notifyAll(); // 队列空,唤醒消费者
            }
            queue.add(item);
        }
    
        // 出队(空则阻塞)
        public synchronized Object dequeue() throws InterruptedException {
            while (queue.size() == 0) {
                wait(); // 队列空,阻塞消费者
            }
            if (queue.size() == limit) {
                notifyAll(); // 队列满,唤醒生产者
            }
            return queue.remove(0);
        }
    }
    
    

    4. JUC中的阻塞队列(常用)

    如ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界/有界)、SynchronousQueue(无缓冲),直接使用即可,无需自定义。

    十四、线程池(核心,笔记细节补全)

    1. 核心价值

    • 避免频繁创建和销毁线程的性能开销(线程创建需分配栈内存和内核对象)。

    • 控制并发线程数量,防止线程过多导致OOM或CPU耗尽。

    • 统一管理线程,便于监控、调度和复用(如任务缓存、拒绝策略)。

    2. 核心结构

    • 工作线程集合:长期存活,循环从队列中获取任务并执行。

    • 阻塞队列:缓存等待执行的任务(类似生产者-消费者模型中的队列)。

    • 拒绝策略:队列满且线程数达到最大时,处理新任务的策略(如抛异常、丢弃、阻塞)。

    3. 简单实现(理解原理)

    // 线程池核心类
    public class ThreadPool {
        private final BlockingQueue taskQueue; // 任务队列
        private final List threads; // 工作线程集合
        private boolean isStopped = false; // 线程池状态
    
        // 构造方法:指定线程数、队列最大容量
        public ThreadPool(int threadCount, int maxTaskCount) {
            taskQueue = new BlockingQueue<>(maxTaskCount);
            threads = new ArrayList<>(threadCount);
            // 初始化工作线程
            for (int i = 0; i < threadCount; i++) {
                threads.add(new PoolThread(taskQueue));
            }
            // 启动所有工作线程
            for (PoolThread thread : threads) {
                thread.start();
            }
        }
    
        // 提交任务
        public synchronized void execute(Runnable task) {
            if (isStopped) {
                throw new IllegalStateException("线程池已停止");
            }
            taskQueue.enqueue(task); // 任务入队
        }
    
        // 停止线程池
        public synchronized void stop() {
            isStopped = true;
            // 停止所有工作线程
            for (PoolThread thread : threads) {
                thread.toStop();
            }
        }
    }
    
    // 工作线程类
    class PoolThread extends Thread {
        private final BlockingQueue taskQueue;
        private boolean isStopped = false;
    
        public PoolThread(BlockingQueue queue) {
            this.taskQueue = queue;
        }
    
        @Override
        public void run() {
            // 循环获取任务,直到线程池停止
            while (!isStopped()) {
                try {
                    // 从队列获取任务(空则阻塞)
                    Runnable task = taskQueue.dequeue();
                    task.run(); // 执行任务
                } catch (Exception e) {
                    // 捕获异常,避免线程退出(线程池继续运行)
                    e.printStackTrace();
                }
            }
        }
    
        // 停止当前工作线程
        public synchronized void toStop() {
            isStopped = true;
            this.interrupt(); // 打断阻塞在dequeue()的线程
        }
    
        public synchronized boolean isStopped() {
            return isStopped;
        }
    }
    

    4. JUC中的线程池(重点)

    使用ja va.util.concurrent.ExecutorService,推荐手动创建ThreadPoolExecutor(避免Executors工具类的OOM风险)。核心参数包括:核心线程数、最大线程数、空闲线程存活时间、任务队列、拒绝策略。

    十五、CAS与原子类(无锁编程核心)

    1. CAS核心概念

    CAS(Compare and Swap,比较并替换)是一种无锁原子操作,底层由CPU指令(如cmpxchg)保证原子性。核心逻辑如下:

    • 传入3个参数:内存地址V、期望值A、新值B。

    • 比较V的值与A:若相等,将V的值替换为B;若不相等,不做操作。

    • 返回操作结果(是否替换成功)。

    2. 核心优点

    无锁、无线程上下文切换开销、无死锁风险,性能优于synchronized(高并发、低冲突场景下尤其明显)。

    3. 核心问题与解决方案

    问题原因解决方案
    ABA问题V的值从A→B→A,CAS认为未修改,导致错误替换用AtomicStampedReference(加版本号)
    自旋消耗CPU高并发下,CAS多次失败,循环重试消耗CPU限制自旋次数,或搭配锁使用
    只能保证单个变量原子性CAS仅能操作单个变量,无法保证多个变量的复合操作原子性用AtomicReference包装多个变量,或使用锁

    4. JUC原子类(常用)

    • 基本类型:AtomicInteger、AtomicLong、AtomicBoolean(如计数器、状态标记)。

    • 引用类型:AtomicReference、AtomicStampedReference(解决ABA问题)。

    • 数组类型:AtomicIntegerArray、AtomicLongArray(原子操作数组元素)。

    十六、同步器核心思想(查漏补缺)

    锁、信号量、阻塞队列等同步器,底层设计逻辑是一致的,都包含4个核心部分:

    • 状态:控制线程访问权限(如Lock的isLocked、Semaphore的permits)。

    • 访问条件:基于状态判断线程是否可访问(如while循环检查,防止假唤醒)。

    • 状态变化:线程获取或释放资源时,修改同步器状态(如Lock的isLocked=true/false)。

    • 通知策略:状态变化后,通知等待线程(notify()/notifyAll(),如释放锁后唤醒等待线程)。

    同步器的两种核心方法

    • Test-and-Set(测试-设置):原子操作,先检查访问条件,满足则修改状态(如CAS、lock())。

    • Set(设置):仅修改状态,不检查条件(如unlock(),持有锁的线程可直接释放)。

    十七、阻塞算法与非阻塞算法(笔记补全)

    1. 核心区别

    类型核心逻辑优点缺点示例
    阻塞算法获取不到资源时,线程挂起,直到资源可用实现简单,无CPU自旋消耗线程切换开销大,可能死锁synchronized、Lock
    非阻塞算法获取不到资源时,不挂起,直接返回或重试无线程切换开销,无死锁实现复杂,高冲突下自旋消耗CPUCAS、原子类

    2. 乐观锁(非阻塞算法核心)

    核心思想:乐观假设“无并发冲突”,线程先拷贝共享资源并修改,再通过CAS将修改写回主内存,冲突则重试。

    • 适用场景:低并发、低冲突(如缓存更新),避免锁的开销。

    • 注意:在高冲突场景下,重试频繁,性能可能低于阻塞算法。

    十八、高频面试重点(浓缩必记)

    1. 线程启动必须用start(),调用run()仅为普通方法调用,不会启动新线程。

    2. 线程安全三要素:原子性(CAS、锁)、可见性(synchronized、volatile)、有序性(synchronized、volatile)。

    3. synchronized与Lock的区别:Lock可中断、可超时、可公平/非公平;synchronized自动释放锁、可重入、简单易用。

    4. 死锁产生的4个条件及避免方法(固定加锁顺序最常用)。

    5. CAS的原理、优点、ABA问题及解决方案。

    6. 线程池的核心价值、结构,以及手动创建ThreadPoolExecutor的原因(避免Executors的OOM)。

    7. 读写锁的核心原则(读-读共存、读-写/写-写互斥)和适用场景(读多写少)。

    8. wait()与sleep()的区别:wait()释放锁、需在同步块中;sleep()不释放锁、可在任意位置调用。

    总结

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Postman macOS版
    Postman macOS版

    Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

    Docker Desktop macOS版
    Docker Desktop macOS版

    Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

    Android Studio macOS版
    Android Studio macOS版

    Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

    Xcode macOS版
    Xcode macOS版

    Xcode 是苹果面向 Mac 提供的官方集成开发环境,将代码编辑、项目构建、SwiftUI 实时预览、设备模拟、自动化测试、断点调试、性能分析和应用分发整合在同一套工作流中,适合开发与维护 iPhone、iPad、Mac、Apple Wa

    JetBrains WebStorm macOS版
    JetBrains WebStorm macOS版

    JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

    PhpStorm macOS版
    PhpStorm macOS版

    PhpStorm 是 JetBrains 推出的专业 PHP 集成开发环境,可在 Mac 上完成代码编写、智能检查、重构、调试、测试和数据库管理。它支持主流 PHP 框架、Composer、Git、Docker 与远程解释器。

    JetBrains PyCharm macOS版
    JetBrains PyCharm macOS版

    JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

    JetBrains IntelliJ IDEA macOS版
    JetBrains IntelliJ IDEA macOS版

    IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

    Visual Studio Code macOS版
    Visual Studio Code macOS版

    Visual Studio Code 是微软提供的免费代码编辑器,支持 macOS,并为 Intel 与 Apple 芯片 Mac 提供适配版本。软件集代码编辑、调试、Git 源代码管理、集成终端和扩展市场于一体。

    REAPER macOS版
    REAPER macOS版

    REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

    Adobe Audition macOS版
    Adobe Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Pro Tools macOS版
    Pro Tools macOS版

    Pro Tools 是 Avid 推出的专业数字音频工作站,覆盖多轨录音、无损剪辑、MIDI 编曲、插件处理、自动化混音及声音与画面同步等工作。它拥有 Intro、Artist、Studio 和 Ultimate 等方案。

    WINDOWS 更多
    Postman Windows版
    Postman Windows版

    Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

    Docker Desktop Windows版
    Docker Desktop Windows版

    Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

    Android Studio Windows版
    Android Studio Windows版

    Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,

    JetBrains WebStorm Windows版
    JetBrains WebStorm Windows版

    WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

    JetBrains PhpStorm Windows版
    JetBrains PhpStorm Windows版

    PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

    JetBrains PyCharm Windows版
    JetBrains PyCharm Windows版

    PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

    JetBrains IntelliJ IDEA Windows版
    JetBrains IntelliJ IDEA Windows版

    JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

    Visual Studio Code Windows版
    Visual Studio Code Windows版

    Visual Studio Code 是微软推出的免费代码编辑器,Windows 版集成智能补全、代码导航、调试、终端和版本控制,并可通过扩展添加语言、格式化及远程开发能力。它启动较快、配置灵活,

    REAPER Windows版
    REAPER Windows版

    REAPER 是 Cockos 推出的数字音频工作站,适用于录音、MIDI 编曲、音频编辑、混音、母带制作及声音设计。软件安装包小巧,支持多轨录制、灵活路由、自动化、第三方插件和脚本扩展,并提供完整功能的 60 天免费评估期。

    Adobe Audition Windows版
    Adobe Audition Windows版

    Adobe Audition 是面向播客、影视后期、广播与音乐制作的专业音频工作站,提供波形编辑、多轨混音、频谱分析、录音、降噪修复和效果处理等功能。Windows 版通过 Adobe Creative Cloud 安装和管理,

    Pro Tools Windows版
    Pro Tools Windows版

    Pro Tools 是 Avid 推出的专业数字音频工作站,提供多轨录音、音频剪辑、MIDI编曲、插件处理、自动化混音及影视声音制作能力。它适合音乐人、录音师、制作人和音频后期团队使用,并提供免费入门版、订阅方案及永久授权选择。

    Cubase Windows版
    Cubase Windows版

    Cubase 是 Steinberg 推出的数字音频工作站,提供 MIDI 编曲、多轨录音、音频编辑、虚拟乐器、效果处理、自动化、混音和母带输出工具。其 Pro、Artist 与 Elements 版本面向不同预算和制作规模,

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com

    Copyright ©2018-2026