以下是为标题《避开并发陷阱!黑马博学谷教你5步掌握Java多线程设计》设计的文章框架及内容示例,结合技术深度与实战指导,帮助读者系统掌握多线程设计:
避开并发陷阱!黑马博学谷教你5步掌握Java多线程设计
引言Java多线程是提升程序性能的核心技术,但线程安全、死锁、资源竞争等问题常让开发者头疼。黑马博学谷通过5步实战法,帮你避开并发陷阱,掌握高效多线程设计!
第一步:理解线程基础与生命周期1. 线程创建方式对比
| [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)]"线程池任务")); |
2. 线程生命周期状态图
1. 同步方法 vs 同步代码块
| [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(--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(--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(--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分段锁优化
| 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写时复制
| 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(--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. 死锁避免方案
| jstack <pid> > thread_dump.log |
行动号召:立即实践上述代码,并尝试在项目中引入线程池和并发工具类,提升系统吞吐量!
扫码加好友,拉您进群



收藏
