当前位置: 首页 > news >正文

Java并发编程,从线程安全到死锁避免的实战解析

Java并发编程是构建高性能系统的核心技能,但也伴随着复杂的挑战。本文通过实际代码示例,系统讲解线程安全、死锁、资源竞争等常见问题的解决方案,并深入探讨如何利用Java并发工具包(java.util.concurrent)构建健壮的并发程序。

一、线程安全问题与解决方案

1.1 共享资源的竞态条件(Race Condition)

问题现象
多个线程同时修改共享变量,导致数据不一致。

public class Counter {private int count = 0;public void increment() {count++; // 非原子操作}public int getCount() {return count;}
}// 测试代码
public class RaceConditionTest {public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Thread t1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {counter.increment();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {counter.increment();}});t1.start();t2.start();t1.join();t2.join();System.out.println("Expected: 20000, Actual: " + counter.getCount());}
}

输出结果

Expected: 20000, Actual: 18437

解决方案

使用synchronized关键字
public class SafeCounter {private int count = 0;public synchronized void increment() {count++;}public synchronized int getCount() {return count;}
}
使用ReentrantLock
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class SafeCounter {private int count = 0;private Lock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public int getCount() {lock.lock();try {return count;} finally {lock.unlock();}}
}
使用AtomicInteger
import java.util.concurrent.atomic.AtomicInteger;public class SafeCounter {private AtomicInteger count = new AtomicInteger(0);public void increment() {count.incrementAndGet(); // 原子操作}public int getCount() {return count.get();}
}

二、死锁问题与避免策略

2.1 死锁产生的条件

四个必要条件

  1. 互斥(Mutual Exclusion)
  2. 请求与保持(Hold and Wait)
  3. 不可抢占(No Preemption)

相关文章:

  • Ubuntu 安装 HAProxy
  • 基于ESP32控制的机器人摄像头车
  • spark-Join Key 的基数/rand函数
  • 海纳思(Hi3798MV300)机顶盒遇到海思摄像头
  • RT-Thread 深入系列 Part 5:物联网与网络应用实战
  • 51c视觉~合集37
  • 使用FastAPI微服务在AWS EKS上实现AI会话历史的管理
  • 计算机网络 4-2-2 网络层(IPv4)
  • 解锁 DevOps 新境界 :使用 Flux 进行 GitOps 现场演示 – 自动化您的 Kubernetes 部署
  • 【RT-Thread Studio】nor flash配置Fal分区
  • Windows:Powershell的使用
  • 程序代码篇---esp32视频流处理
  • Taro 编译不平不同平台小程序
  • 《类和对象(中)》
  • 分布式事务快速入门
  • Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程
  • Autoware message_filters::Synchronizer链接错误问题
  • 如何删除网上下载的资源后面的文字
  • 数字孪生实战笔记(1)数字孪生的含义、应用及技术体系
  • zdir3个人网盘dockerfile打包
  • 名帅大挪移提前开启,意属皇马的阿隆索会是齐达内第二吗
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 胳膊一抬就疼,炒菜都成问题?警惕这种“炎症”找上门
  • 欧洲承诺投资6亿欧元吸引外国科学家
  • 奥园集团将召开债券持有人会议,拟调整“H20奥园2”本息兑付方案
  • 5月12日至13日北京禁飞“低慢小”航空器