Java 高并发七:并发设计模型详解

上传者: 38746926 | 上传时间: 2026-04-16 21:51:56 | 文件大小: 157KB | 文件类型: PDF
不变性 private final String name; private final double price; public Product(String name, double price) { this.name = name; this.price = price; } // 不提供修改状态的方法,只提供getter public String getName() { return name; } public double getPrice() { return price; } // 重写equals和hashCode,确保比较的是对象的内容而不是引用 override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Product product = (Product) obj; return Double.compare(product.price, price) == 0 && name.equals(product.name); } @Override public int hashCode() { return Objects.hash(name, price); } } 在不变模式中,对象一旦创建,其内部状态就不能改变。这提高了线程安全性,因为不需要担心并发更新引发的问题。同时,不变对象也可以作为线程安全的构建块用于构建更复杂的并发系统。 4. Future模式 Future模式允许启动一个异步操作并立即返回一个表示该操作的Future对象。当异步操作完成时,可以通过Future对象获取结果。在Java中,`java.util.concurrent.Future`接口代表一个异步计算的结果。以下是一个简单的例子: ```java import java.util.concurrent.*; ExecutorService executor = Executors.newFixedThreadPool(1); Future future = executor.submit(new Callable() { @Override public Integer call() throws Exception { Thread.sleep(1000); // 模拟耗时操作 return 100; } }); // 这里可以做其他事情,不阻塞主线程 try { System.out.println("Future result: " + future.get()); // 获取异步操作的结果 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executor.shutdown(); // 关闭线程池 } ``` 在Future模式中,调用`get()`方法会阻塞,直到计算完成。如果不想阻塞,可以使用`isDone()`检查任务是否完成,或者使用`get(long timeout, TimeUnit unit)`设置超时时间。 5. 生产者消费者模式 生产者消费者模式是一种多线程协作的设计模式,用于解决生产者和消费者之间的工作协同问题。生产者负责产生资源,而消费者负责消费资源。Java中的`BlockingQueue`接口提供了很好的支持,例如`ArrayBlockingQueue`。 ```java import java.util.concurrent.*; class Producer implements Runnable { private final BlockingQueue queue; public Producer(BlockingQueue queue) { this.queue = queue; } @Override public void run() { for (int i = 0; i < 10; i++) { try { queue.put(i); Thread.sleep(100); // 模拟生产速度 } catch (InterruptedException e) { e.printStackTrace(); } } } } class Consumer implements Runnable { private final BlockingQueue queue; public Consumer(BlockingQueue queue) { this.queue = queue; } @Override public void run() { while (true) { try { System.out.println("Consumed: " + queue.take()); Thread.sleep(200); // 模拟消费速度 } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { BlockingQueue queue = new ArrayBlockingQueue<>(10); Thread producerThread = new Thread(new Producer(queue)); Thread consumerThread = new Thread(new Consumer(queue)); producerThread.start(); consumerThread.start(); try { producerThread.join(); consumerThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个例子中,`BlockingQueue`作为共享资源,生产者将元素放入队列,而消费者从队列中取出元素。`put()`和`take()`方法会自动处理线程同步,避免了竞态条件。 总结来说,Java的并发设计模型包括了多种策略,如单例模式保证对象的唯一性,不变模式确保对象状态不可变以提升线程安全,Future模式支持异步操作的执行与结果获取,以及生产者消费者模式协调不同线程间的任务执行。理解并灵活运用这些模式对于构建高效的并发应用程序至关重要。

文件下载

评论信息

免责申明

【只为小站】的资源来自网友分享,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,【只为小站】 无法对用户传输的作品、信息、内容的权属或合法性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论 【只为小站】 经营者是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。
本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二条之规定,若资源存在侵权或相关问题请联系本站客服人员,zhiweidada#qq.com,请把#换成@,本站将给予最大的支持与配合,做到及时反馈和处理。关于更多版权及免责申明参见 版权及免责申明