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

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

分布式并发设计模式详解

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

1. 单例模式(singleton)

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

原理:

设计师AI工具箱 设计师AI工具箱

最懂设计师的效率提升平台,实现高效设计出图和智能改图,室内设计,毛坯渲染,旧房改造 ,软装设计

设计师AI工具箱 124 查看详情 设计师AI工具箱 私有构造函数:防止外部通过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  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() {

以上就是分布式并发设计模式有哪些及其实现原理?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/375056.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
为什么 JavaScript 不混乱?
上一篇 2025年11月6日 09:22:49
命运方舟赤子流斗魂铭刻怎么选-赤子之心斗魂铭刻搭配攻略
下一篇 2025年11月6日 09:22:53

相关推荐

发表回复

登录后才能评论
关注微信