全部版块 我的主页
论坛 休闲区 十二区 休闲灌水
202 0
2025-09-29

以下是为标题《避开并发陷阱!黑马博学谷教你5步掌握Java多线程设计》设计的文章框架及内容示例,结合技术深度与实战指导,帮助读者系统掌握多线程设计:


标题

避开并发陷阱!黑马博学谷教你5步掌握Java多线程设计

引言

Java多线程是提升程序性能的核心技术,但线程安全、死锁、资源竞争等问题常让开发者头疼。黑马博学谷通过5步实战法,帮你避开并发陷阱,掌握高效多线程设计!

第一步:理解线程基础与生命周期

1. 线程创建方式对比

  • 继承Thread类 vs 实现Runnable接口 vs 调用ExecutorService[color=var(--header-text-color)]java


    [color=var(--code-comment-color)]// 方式1:继承Thread


    [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Thread(() -> System.out.println([color=var(--code-string-color)]"Runnable任务")).start();



    [color=var(--code-comment-color)]// 方式2:实现Runnable(推荐)


    [color=var(--code-keyword-color)]Thread [color=var(--code-constant-color)]thread [color=var(--code-constant-color)]= [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Thread([color=var(--code-keyword-color)]new [color=var(--code-entity-color)]MyRunnable());



    [color=var(--code-comment-color)]// 方式3:线程池(高效资源管理)


    [color=var(--code-keyword-color)]ExecutorService [color=var(--code-constant-color)]executor [color=var(--code-constant-color)]= Executors.newFixedThreadPool([color=var(--code-constant-color)]5);


    executor.submit(() -> System.out.println([color=var(--code-string-color)]"线程池任务"));


    陷阱提示:直接继承Thread会导致资源浪费,优先使用线程池。

2. 线程生命周期状态图

  • NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED
    关键点:wait()和sleep()的区别(是否释放锁)。
第二步:同步机制与锁优化

1. 同步方法 vs 同步代码块

  • 同步方法锁范围过大,易引发性能问题:[color=var(--header-text-color)]java


    [color=var(--code-comment-color)]// 同步方法(不推荐)


    [color=var(--code-keyword-color)]public [color=var(--code-keyword-color)]synchronized [color=var(--code-keyword-color)]void [color=var(--code-entity-color)]badSyncMethod[color=var(--code-string-color)]() { ... }



    [color=var(--code-comment-color)]// 同步代码块(精准控制锁对象)


    [color=var(--code-keyword-color)]public [color=var(--code-keyword-color)]void [color=var(--code-entity-color)]goodSyncMethod[color=var(--code-string-color)]() {


        [color=var(--code-keyword-color)]synchronized([color=var(--code-variable-color)]this) { ... } [color=var(--code-comment-color)]// 锁当前对象


        [color=var(--code-comment-color)]// 或使用特定锁对象


        [color=var(--code-keyword-color)]private [color=var(--code-keyword-color)]final [color=var(--code-keyword-color)]Object [color=var(--code-constant-color)]lock [color=var(--code-constant-color)]= [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Object();


        [color=var(--code-keyword-color)]synchronized(lock) { ... }


    }



2. 显式锁ReentrantLock的高级用法

  • 可中断锁:解决长时间等待问题[color=var(--header-text-color)]java


    [color=var(--code-keyword-color)]Lock [color=var(--code-constant-color)]lock [color=var(--code-constant-color)]= [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]ReentrantLock();


    [color=var(--code-keyword-color)]try {


        [color=var(--code-keyword-color)]if (lock.tryLock([color=var(--code-constant-color)]1, TimeUnit.SECONDS)) { [color=var(--code-comment-color)]// 1秒内获取锁


            [color=var(--code-comment-color)]// 业务逻辑


        } [color=var(--code-keyword-color)]else {


            System.out.println([color=var(--code-string-color)]"获取锁超时");


        }


    } [color=var(--code-keyword-color)]catch (InterruptedException e) {


        Thread.currentThread().interrupt(); [color=var(--code-comment-color)]// 恢复中断状态


    } [color=var(--code-keyword-color)]finally {


        lock.unlock();


    }


    陷阱提示:忘记释放锁会导致死锁!
第三步:并发工具类实战

1. CountDownLatch控制线程等待

  • 场景:多线程初始化后统一执行[color=var(--header-text-color)]java


    [color=var(--code-keyword-color)]CountDownLatch [color=var(--code-constant-color)]latch [color=var(--code-constant-color)]= [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]CountDownLatch([color=var(--code-constant-color)]3);


    [color=var(--code-keyword-color)]for ([color=var(--code-keyword-color)]int [color=var(--code-constant-color)]i [color=var(--code-constant-color)]= [color=var(--code-constant-color)]0; i < [color=var(--code-constant-color)]3; i++) {


        [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Thread(() -> {


            System.out.println([color=var(--code-string-color)]"子线程准备就绪");


            latch.countDown();


        }).start();


    }


    latch.await(); [color=var(--code-comment-color)]// 主线程等待所有子线程完成


    System.out.println([color=var(--code-string-color)]"所有线程就绪,开始执行");



2. CyclicBarrier实现线程分阶段协作

  • 场景:多线程分阶段完成任务[color=var(--header-text-color)]java


    [color=var(--code-keyword-color)]CyclicBarrier [color=var(--code-constant-color)]barrier [color=var(--code-constant-color)]= [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]CyclicBarrier([color=var(--code-constant-color)]3, () ->


        System.out.println([color=var(--code-string-color)]"所有线程完成第一阶段"));



    [color=var(--code-keyword-color)]for ([color=var(--code-keyword-color)]int [color=var(--code-constant-color)]i [color=var(--code-constant-color)]= [color=var(--code-constant-color)]0; i < [color=var(--code-constant-color)]3; i++) {


        [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Thread(() -> {


            [color=var(--code-keyword-color)]try {


                System.out.println([color=var(--code-string-color)]"线程完成自身任务");


                barrier.await(); [color=var(--code-comment-color)]// 等待其他线程


                System.out.println([color=var(--code-string-color)]"进入第二阶段");


            } [color=var(--code-keyword-color)]catch (Exception e) { e.printStackTrace(); }


        }).start();


    }



第四步:线程安全数据结构

1. ConcurrentHashMap分段锁优化

  • 对比HashMap的线程不安全与Hashtable的全表锁:[color=var(--header-text-color)]java


    Map<String, String> map = [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]ConcurrentHashMap<>();


    map.put([color=var(--code-string-color)]"key", [color=var(--code-string-color)]"value"); [color=var(--code-comment-color)]// 线程安全且高效



2. CopyOnWriteArrayList写时复制

  • 适用读多写少场景:[color=var(--header-text-color)]java


    List<String> list = [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]CopyOnWriteArrayList<>();


    list.add([color=var(--code-string-color)]"A"); [color=var(--code-comment-color)]// 写操作会复制新数组


    [color=var(--code-comment-color)]// 读操作无需加锁


    [color=var(--code-keyword-color)]for (String s : list) { System.out.println(s); }



第五步:死锁检测与避免策略

1. 死锁产生的4个必要条件

  • 互斥条件、占有并等待、非抢占、循环等待
    示例死锁代码[color=var(--header-text-color)]java


    [color=var(--code-keyword-color)]Object [color=var(--code-constant-color)]lockA [color=var(--code-constant-color)]= [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Object(), lockB = [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Object();


    [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Thread(() -> {


        [color=var(--code-keyword-color)]synchronized(lockA) {


            [color=var(--code-keyword-color)]synchronized(lockB) { System.out.println([color=var(--code-string-color)]"死锁线程"); }


        }


    }).start();



    [color=var(--code-keyword-color)]new [color=var(--code-entity-color)]Thread(() -> {


        [color=var(--code-keyword-color)]synchronized(lockB) {


            [color=var(--code-keyword-color)]synchronized(lockA) { System.out.println([color=var(--code-string-color)]"另一个死锁线程"); }


        }


    }).start();



2. 死锁避免方案

  • 按固定顺序获取锁:所有线程先获取lockA再获取lockB
  • 使用tryLock设置超时:如第二步中的ReentrantLock示例
  • 工具检测:通过jstack命令分析线程堆栈[color=var(--header-text-color)]bash


    jstack <pid> > thread_dump.log



总结与进阶建议
  • 核心原则:最小化锁范围、优先使用并发工具类、避免嵌套锁。
  • 进阶学习
    • 深入JVM内存模型(JMM)与volatile关键字
    • 探索Disruptor等高性能并发框架
  • 黑马博学谷课程推荐
    • 《Java并发编程实战营》:含真实项目中的并发问题拆解
    • 《高并发系统设计》:从代码到架构的全链路优化

行动号召:立即实践上述代码,并尝试在项目中引入线程池和并发工具类,提升系统吞吐量!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群