0

0

分布式并发设计模式有哪些及其实现原理?

DDD

DDD

发布时间:2024-12-01 18:00:20

|

861人浏览过

|

来源于php中文网

原创

分布式并发设计模式有哪些及其实现原理?

分布式并发设计模式详解

在分布式开发中,除了常规的23种设计模式外,还有一些针对并发场景的常用设计模式,本文将对这些模式进行详细介绍。

1. 单例模式(singleton)

  • 概念:确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
  • 原理:

    魔法映像企业网站管理系统
    魔法映像企业网站管理系统

    技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

    下载
    • 私有构造函数:防止外部通过new关键字创建类的实例。
    • 静态实例变量:保存类的唯一实例。
    • 全局访问点:通常是一个静态方法,用于获取类的实例。
  • 并发代码示例:

    public class singleton {
      private static volatile singleton instance;
      
      private singleton() {
          // 私有构造函数
      }
      
      public static singleton getinstance() {
          if (instance == null) { // 第一次检查
              synchronized (singleton.class) { // 同步锁
                  if (instance == null) { // 第二次检查
                      instance = new singleton();
                  }
              }
          }
          return instance;
      }
    }

2. 不可变对象模式(immutable object)

  • 概念:一旦创建了一个对象,其状态就不能被修改。
  • 原理:

    • 所有属性都是final的:这意味着一旦初始化后,属性值不能被改变。
    • 不提供修改状态的方法:不可变对象不提供任何可以修改其状态的方法。
    • 通过构造函数初始化所有属性:在对象创建时,必须通过构造函数初始化所有属性。
    • 深度复制:如果对象包含可变对象,需要确保这些对象在创建时也是不可变的,或者在返回时创建它们的副本。
  • 并发代码示例:

    public final class immutableperson {
      private final string name;
      private final int age;
    
      public immutableperson(string name, int age) {
          this.name = name;
          this.age = age;
      }
    
      public string getname() {
          return name;
      }
    
      public int getage() {
          return age;
      }
    
      public immutableperson setname(string newname) {
          return new immutableperson(newname, age);
      }
    
      public immutableperson setage(int newage) {
          return new immutableperson(name, newage);
      }
    }

3. 线程局部存储模式(thread local storage)

  • 概念:允许在多线程环境下为每个线程维护一个独立的变量副本。
  • 原理:

    • threadlocal类:java提供了threadlocal类来支持线程局部存储。threadlocal为每个使用该变量的线程提供独立的变量副本,通过这个副本,每个线程都可以独立地改变自己的副本而不影响其他线程的副本。
    • 副本的创建和获取:threadlocal提供了get和set方法来获取和设置当前线程的变量副本。
  • 并发代码示例:

    public class threadlocalexample {
      // 定义一个threadlocal变量,用于存储线程级别的变量
      private static final threadlocal threadlocal = new threadlocal();
    
      public static void setthreadlocalvalue(string value) {
          threadlocal.set(value);
      }
    
      public static string getthreadlocalvalue() {
          return threadlocal.get();
      }
    
      public static void main(string[] args) {
          // 在主线程中设置和获取threadlocal变量的值
          setthreadlocalvalue("main thread value");
          system.out.println("main thread value: " + getthreadlocalvalue());
    
          // 创建一个新线程并设置和获取threadlocal变量的值
          thread thread = new thread(() -> {
              setthreadlocalvalue("child thread value");
              system.out.println("child thread value: " + getthreadlocalvalue());
          });
          thread.start();
      }
    }

4. 生产者-消费者模式(producer-consumer)

  • 概念:将数据的生成(生产者)和数据的处理(消费者)分离来解决并发问题。
  • 原理:

    • 共享数据结构:通常使用队列作为共享的数据结构,生产者将数据放入队列中,消费者从队列中取出数据。
    • 同步:生产者和消费者需要同步对共享数据结构的访问,以避免并发问题。可以使用锁、信号量、阻塞队列等机制来实现同步。
    • 阻塞和唤醒:当队列满时,生产者应该阻塞等待;当队列空时,消费者应该阻塞等待。当队列状态改变时,需要唤醒相应的生产者或消费者。
  • 并发代码示例:

    import java.util.concurrent.blockingqueue;
    import java.util.concurrent.linkedblockingqueue;
    
    class producer implements runnable {
      private final blockingqueue queue;
    
      public producer(blockingqueue q) {
          queue = q;
      }
    
      public void run() {
          try {
              for (int i = 0; i < 10; i++) {
                  queue.put(i);
                  system.out.println("produced: " + i);
              }
          } catch (interruptedexception ex) {
              ex.printstacktrace();
          }
      }
    }
    
    class consumer implements runnable {
      private final blockingqueue queue;
    
      public consumer(blockingqueue q) {
          queue = q;
      }
    
      public void run() {
          try {
              while (true) {
                  int value = queue.take();
                  system.out.println("consumed: " + value);
              }
          } catch (interruptedexception ex) {
              ex.printstacktrace();
          }
      }
    }
    
    public class producerconsumerexample {
      public static void main(string[] args) {
          blockingqueue queue = new linkedblockingqueue(10);
          producer producer = new producer(queue);
          consumer consumer = new consumer(queue);
    
          new thread(producer).start();
          new thread(consumer).start();
      }
    }

5. 读者-写者模式(read-write lock)

  • 概念:允许多个读者同时访问数据,但在写者访问时,其他的读者或写者都会被阻塞。
  • 原理:

    • 读写锁:使用readwritelock接口和reentrantreadwritelock类来实现。这种锁有两个锁,一个用于读操作,一个用于写操作。
    • 锁的获取和释放:读者获取读锁,写者获取写锁。读锁可以被多个读者同时持有,而写锁是独占的。
    • 锁的升级和降级:在某些情况下,可能需要从读锁升级到写锁,或者从写锁降级到读锁。
  • 并发代码示例:

    import java.util.concurrent.locks.readwritelock;
    import java.util.concurrent.locks.reentrantreadwritelock;
    
    class sharedresource {
      private final readwritelock readwritelock = new reentrantreadwritelock();
      private final lock readlock = readwritelock.readlock();
      private final lock writelock = readwritelock.writelock();
      private string data;
    
      public void read() {
          readlock.lock();
          try {
              // 读取数据
              system.out.println("reading data: " + data);
          } finally {
              readlock.unlock();
          }
      }
    
      public void write(string newdata) {
          writelock.lock();
          try {
              // 写入数据
              data = newdata;
              system.out.println("writing data: " + data);
          } finally {
              writelock.unlock();
          }
      }
    }
    
    public class readwritelockexample {
      public static void main(string[] args) {
          sharedresource resource = new sharedresource();
    
          // 创建多个读者线程
          for (int i = 0; i < 5; i++) {
              new thread(resource::read).start();
          }
    
          // 创建写者线程
          new thread(() -> resource.write("new data")).start();
      }
    }

6. 工作队列模式(worker thread)

  • 概念:将任务的提交与任务的执行分离。
  • 原理:

    • 任务队列:使用一个队列来存储提交的任务。
    • 工作者线程:创建一组后台线程作为工作者线程,它们不断地从任务队列中取出任务并执行。
    • 任务提交:客户端将任务提交到队列中,不需要关心任务的执行细节。
  • 并发代码示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

class Task implements Runnable {
    private final int taskId;

    public Task(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

328

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

235

2023.10.07

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

538

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

26

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1100

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

189

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1554

2025.12.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

142

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号