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

做网站 除了域名自己制作wordpress子主题

做网站 除了域名,自己制作wordpress子主题,php网站怎么缓存,手机网站开发下崽🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第十六章屏障(Barrier),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 屏障的同步机制 2. 关键参数 二…

🌟 大家好,我是摘星! 🌟

今天为大家带来的是并发设计模式实战系列,第十六章屏障(Barrier),废话不多说直接开始~

目录

一、核心原理深度拆解

1. 屏障的同步机制

2. 关键参数

二、生活化类比:团队登山

三、Java代码实现(生产级Demo)

1. 完整可运行代码

2. 关键方法说明

四、横向对比表格

1. 同步工具对比

2. 屏障参数配置对比

五、高级应用技巧

1. 多阶段任务控制

2. 动态线程管理

3. 性能监控

六、工程实践中的陷阱与解决方案

1. 死锁风险场景

2. 屏障断裂处理

七、性能优化技巧

1. 分层屏障设计

2. 与ForkJoinPool结合

八、分布式屏障扩展(ZooKeeper实现)

1. 核心原理

2. Java代码片段

九、监控与调试方案

1. 关键监控指标

2. Arthas诊断命令

十、与其他模式的组合应用

1. 屏障 + 生产者消费者模式

2. 代码示例


一、核心原理深度拆解

1. 屏障的同步机制

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  线程1       │    │  线程2       │    │  线程N       │
│ 执行阶段1    │    │ 执行阶段1    │    │ 执行阶段1    │
└──────┬──────┘    └──────┬──────┘    └──────┬──────┘│                  │                  │└─────────┬────────┴────────┬─────────┘│   屏障点         │▼                  ▼┌───────────────────┐│   所有线程到达后    ││   才继续执行阶段2   │└───────────────────┘
  • 协调机制:强制多个线程在某个点等待,直到所有参与线程都到达该点
  • 重置特性:CyclicBarrier 可重复使用(自动重置),CountDownLatch 不可重置

2. 关键参数

  • parties:需要等待的线程数量
  • barrierAction:所有线程到达后触发的回调(可选)

二、生活化类比:团队登山

系统组件

现实类比

核心行为

线程

登山队员

各自以不同速度攀登

屏障点

集合点

必须所有队员到齐才能继续前进

barrierAction

领队

检查装备、宣布下一阶段路线

  • 异常处理:若有队员受伤(线程中断),其他队员需要决定是否继续等待

三、Java代码实现(生产级Demo)

1. 完整可运行代码

import java.util.concurrent.*;
import java.util.Random;public class BarrierPatternDemo {// 登山模拟static class MountainClimbing {private final CyclicBarrier barrier;private final Random rand = new Random();public MountainClimbing(int teamSize) {// 屏障点设置:队伍到齐后执行领队指令this.barrier = new CyclicBarrier(teamSize, () -> {System.out.println("\n=== 所有队员已到达集合点 ===");System.out.println("领队:检查装备完毕,向下一营地前进!");});}public void climb(String name) {try {// 第一阶段攀登int time = rand.nextInt(3000);System.out.printf("%s 正在攀登第一段(预计%dms)...\n", name, time);Thread.sleep(time);System.out.printf("[%s] 到达第一集合点,等待队友...\n", name);barrier.await();  // 等待所有队员// 第二阶段(屏障解除后)time = rand.nextInt(4000);System.out.printf("%s 向顶峰冲刺(预计%dms)...\n", name, time);Thread.sleep(time);System.out.printf("[%s] 成功登顶!\n", name);} catch (InterruptedException | BrokenBarrierException e) {System.out.printf("[%s] 登山中断: %s\n", name, e.getMessage());}}}public static void main(String[] args) {final int TEAM_SIZE = 3;MountainClimbing expedition = new MountainClimbing(TEAM_SIZE);// 创建登山线程ExecutorService pool = Executors.newFixedThreadPool(TEAM_SIZE);for (int i = 1; i <= TEAM_SIZE; i++) {String name = "队员-" + i;pool.execute(() -> expedition.climb(name));}pool.shutdown();}
}

2. 关键方法说明

// 1. 屏障等待(可设置超时)
barrier.await(5, TimeUnit.SECONDS);// 2. 检查屏障状态
barrier.isBroken();  // 是否有线程被中断
barrier.getNumberWaiting();  // 当前等待的线程数// 3. 重置屏障(CyclicBarrier特有)
barrier.reset();

四、横向对比表格

1. 同步工具对比

工具

可重用性

可中断

额外功能

适用场景

CyclicBarrier

支持回调(barrierAction)

多阶段任务同步

CountDownLatch

一次性

主线程等待多个子线程完成

Phaser

动态注册/注销

复杂分阶段任务

Exchanger

数据交换

线程间数据传递

2. 屏障参数配置对比

配置项

CyclicBarrier

CountDownLatch

初始化参数

等待线程数

需要countDown的次数

重用方式

自动重置

需重新创建实例

异常处理

BrokenBarrierException

无特殊异常


五、高级应用技巧

1. 多阶段任务控制

// 使用多个屏障实现多阶段同步
CyclicBarrier phase1 = new CyclicBarrier(3);
CyclicBarrier phase2 = new CyclicBarrier(3, ()->System.out.println("阶段2完成"));// 线程中按顺序等待
phase1.await();
// 执行阶段1任务...
phase2.await();

2. 动态线程管理

// 使用Phaser替代(JDK7+)
Phaser phaser = new Phaser(1); // 注册主线程
for (int i = 0; i < 3; i++) {phaser.register(); // 动态注册任务线程new Thread(() -> {doWork();phaser.arriveAndDeregister(); // 完成任务后注销}).start();
}
phaser.arriveAndAwaitAdvance(); // 主线程等待

3. 性能监控

// 监控屏障等待情况
System.out.println("当前等待线程数: " + barrier.getNumberWaiting());
if (barrier.isBroken()) {System.out.println("警告:屏障已被破坏!");
}

六、工程实践中的陷阱与解决方案

1. 死锁风险场景

// 错误示例:线程池大小 < 屏障要求的parties数
ExecutorService pool = Executors.newFixedThreadPool(2);
CyclicBarrier barrier = new CyclicBarrier(3); // 要求3个线程
pool.submit(() -> barrier.await()); // 永远阻塞
pool.submit(() -> barrier.await());

解决方案

  • 确保线程池大小 ≥ parties数
  • 添加超时机制:
barrier.await(10, TimeUnit.SECONDS);

2. 屏障断裂处理

当某个等待线程被中断或超时,会触发BrokenBarrierException,此时需要:

try {barrier.await();
} catch (BrokenBarrierException e) {// 1. 记录断裂原因// 2. 重置屏障或终止任务barrier.reset(); // 仅CyclicBarrier有效
}

七、性能优化技巧

1. 分层屏障设计

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  子任务组1   │    │  子任务组2   │    │  子任务组N   │
│  (屏障A)     │    │  (屏障A)     │    │  (屏障A)     │
└──────┬──────┘    └──────┬──────┘    └──────┬──────┘│                  │                  │└─────────┬────────┴────────┬─────────┘│   全局屏障B      │▼                  ▼┌───────────────────┐│   最终聚合处理     │└───────────────────┘

适用场景:大数据分片处理(如MapReduce)

2. 与ForkJoinPool结合

ForkJoinPool pool = new ForkJoinPool(4);
CyclicBarrier barrier = new CyclicBarrier(4);pool.execute(() -> {// 分治任务1barrier.await();// 合并结果...
});

八、分布式屏障扩展(ZooKeeper实现)

1. 核心原理

┌─────────────┐    ┌─────────────┐
│  节点1       │    │  节点2       │
│ 创建临时节点 │───>│ 监听节点变化 │
└─────────────┘    └─────────────┘│               ▲└───────┬───────┘▼┌─────────────┐│  ZooKeeper   ││  /barrier    │└─────────────┘

2. Java代码片段

public class DistributedBarrier {private final ZooKeeper zk;private final String barrierPath;public void await() throws Exception {zk.create(barrierPath + "/node", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);while (true) {List<String> nodes = zk.getChildren(barrierPath, false);if (nodes.size() >= REQUIRED_NODES) {break; // 所有节点就绪}Thread.sleep(100);}}
}

九、监控与调试方案

1. 关键监控指标

指标

采集方式

健康阈值

平均等待时间

Barrier日志打点 + Prometheus

< 任务超时时间的20%

屏障断裂次数

异常捕获统计

每小时 < 3次

线程阻塞比例

ThreadMXBean监控

< 线程数的30%

2. Arthas诊断命令

# 查看屏障状态
watch java.util.concurrent.CyclicBarrier getParties returnObj
# 监控等待线程
thread -b | grep 'await'

十、与其他模式的组合应用

1. 屏障 + 生产者消费者模式

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  生产者线程  │    │  生产者线程  │    │  屏障        │
│  生产数据    │───>│ 提交到队列   │───>│ 等待所有生产 │
└─────────────┘    └─────────────┘    └──────┬──────┘│
┌─────────────┐    ┌─────────────┐    ┌──────▼──────┐
│  消费者线程  │    │  消费者线程  │    │  屏障释放   │
│  开始消费    │<───│ 从队列获取   │<───│ 触发消费信号│
└─────────────┘    └─────────────┘    └─────────────┘

2. 代码示例

BlockingQueue<Data> queue = new LinkedBlockingQueue<>();
CyclicBarrier producerBarrier = new CyclicBarrier(3, () -> {System.out.println("所有生产者完成,启动消费者");startConsumers();
});// 生产者线程
void produce() {queue.put(generateData());producerBarrier.await();
}

文章转载自:

http://3xzH7ERH.bypfj.cn
http://dz7Dqr7J.bypfj.cn
http://uYN66kui.bypfj.cn
http://I9Myiw6M.bypfj.cn
http://3nVDdVr2.bypfj.cn
http://doYTAux7.bypfj.cn
http://cT8sd1Xw.bypfj.cn
http://2JE3Vd6I.bypfj.cn
http://YN7HIGGm.bypfj.cn
http://QWYsHGr9.bypfj.cn
http://S1uSinlw.bypfj.cn
http://6qM2CSuR.bypfj.cn
http://EKXI3JXm.bypfj.cn
http://qoJisoyA.bypfj.cn
http://EPoQ2ATx.bypfj.cn
http://ammj1zoZ.bypfj.cn
http://EnmOURPq.bypfj.cn
http://pQJRq7KP.bypfj.cn
http://zqV8ciMI.bypfj.cn
http://88vFocvH.bypfj.cn
http://4sT0DakG.bypfj.cn
http://V5hBHV2X.bypfj.cn
http://Pwl1MD4h.bypfj.cn
http://sjtcMpTj.bypfj.cn
http://PRe6Dx1S.bypfj.cn
http://zpWUXTaj.bypfj.cn
http://dFYPfbv4.bypfj.cn
http://GB9PJ0i5.bypfj.cn
http://Xw8NzjYY.bypfj.cn
http://vYJGGWrn.bypfj.cn
http://www.dtcms.com/wzjs/766521.html

相关文章:

  • 品牌网站什么意思长春企业免费建站
  • 设计师找图网站女孩子做电商运营是不是压力很大
  • 广园路建设公司网站免费cdn服务器
  • c 做网站网站鑫灵锐做网站多少钱
  • 网站群内容管理系统的设计与实现wordpress用redis和mem
  • 小程序和网站开发难度厦门seo服务
  • 宁夏城乡住房建设厅网站做自媒体查找素材的网站
  • 企业网站内容策划wordpress禁用admin用户
  • 网站开发支持上传gif杭州人才网
  • 网站是哪个公司做的菜鸟制作个人网站网页实例
  • 做外贸应该去什么网站wordpress登录链接
  • seo网站关键词优化工具wordpress iis 中文乱码
  • 直播网站建设1个节点多少钱贵阳做网站软件
  • 网站建设流程时间表不良网站代码怎么查
  • 具有价值的响应式网站建程网土石方工程
  • 济南润尔网站建设技术公司江西赣州公司
  • 代理下单网站开发广州小型企业网站建设
  • 什么网站做简历模板宁波 手机网站建设
  • 免x网站wordpress界面变宽
  • 做网站和做app哪个贵哪个网站做照片书最好看
  • 建筑专业网站建设怎么创作一个微信小程序
  • 河南 网站建设网站开发产品规划要求
  • 旅游网站系统设计与开发无锡网站推广无锡做网站
  • 网站备案证图片做网站要用什么语言
  • 网站建设高考题佛山网站建设公司价格多少
  • 新网站如何被网站收录网站建设服务器介绍图片
  • 天津企业模板建站建站快车源码
  • 金融产品做网站推广温州网页网站制作
  • 企业不想做网站的原因我想开个公司怎么注册
  • 建网站 英文视频直播app