当前位置:首页 > 技术 > 正文内容

深入理解Java多线程编程

访客 技术 2026年7月18日 2

在开始之前,确保您已经了解了进程和线程的基本概念。本文将探讨如何通过多线程技术更高效地利用CPU资源。

多线程基础概念

多线程程序是指在一个进程中同时运行多个线程。并发与并行是两个重要概念:

  • 并行:多个处理器或计算机同时执行一段代码。
  • 并发:通过CPU调度算法实现表面上的同时执行。

线程安全

当多个线程访问共享资源时,若结果不受线程调度顺序影响,则称该代码为线程安全。例如,不使用事务的转账操作可能导致数据不一致:

public void transfer(Account source, Account target, double amount) {
    synchronized (this) {
        target.setBalance(target.getBalance() + amount);
        source.setBalance(source.getBalance() - amount);
    }
}

线程状态及其转换

线程通常会经历以下几种状态:

  • New(新建)
  • Runnable(可运行)
  • Blocked(阻塞)
  • Waiting(等待)
  • Timed Waiting(计时等待)
  • Terminated(终止)

同步机制

synchronized、wait 和 notify 是Java中常用的同步工具。它们可以用于控制多个线程对共享资源的访问。

示例:生产者-消费者问题

public class Storage {
    private int count = 0;
    final int MAX_COUNT = 10;

    public synchronized void produce() {
        if (count >= MAX_COUNT) {
            try {
                wait();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return;
        }
        count++;
        System.out.println("Produced one item. Current count: " + count);
        notifyAll();
    }

    public synchronized void consume() {
        if (count <= 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return;
        }
        count--;
        System.out.println("Consumed one item. Remaining count: " + count);
        notifyAll();
    }
}

高级特性

ThreadLocal变量

ThreadLocal允许每个线程拥有独立的变量副本,适用于需要隔离的数据场景。

原子类

AtomicInteger等原子类提供了一种无锁的方式来进行数值更新,适合高并发环境下的简单运算。

Lock接口

ReentrantLock提供了比synchronized更多的灵活性,包括支持公平锁、非阻塞获取锁等功能。

并发集合

ConcurrentHashMap是一个高效的线程安全哈希表实现,适合多线程环境下频繁读写的场景。

线程池

ExecutorService框架简化了线程管理,使得创建和管理线程变得更加容易。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。