import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/*
* 版本4 备忘录的技术
*/
public class Memorizer4<A, V> implements Computeable<A, V> {
private final Computeable<A, V> c; // 真正负责计算的对象 组合的设计模式
private final ConcurrentHashMap<A, Future<V>> cache = new ConcurrentHashMap<A, Future<V>>();
//将一个线程作为 值放入map 这个线程可以有返回值
// f.get() 是一个阻塞的方法 等待计算线程完成
public Memorizer4(Computeable<A, V> c) {
this.c = c;
}
@Override
public V compute(final A arg) throws InterruptedException {
Future<V> task = cache.get(arg);
if (task == null) {
Callable<V> eval = new Callable<V>() {
@Override
public V call() throws Exception {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<V>(eval);
/* task = ft;
cache.put(arg, task);
ft.run(); // 调用c.compute 发生在这里
*/
task = cache.putIfAbsent(arg, ft);//是concurrentmap增强的原子操作,再次检查一遍 传说中的double-check??
if (task == null) {
task = ft;
ft.run();
}
}
try {
return task.get();
} catch (ExecutionException e) {
// throw launderThrowable(e.getCause()); 这里的异常处理不合理 我不知道怎么做s
return null;
}
}
}
看别人是怎样一步一步完善程序...提高性能的....
public interface Computeable<A, V> {
public V compute(A arg) throws InterruptedException;
}
import java.math.BigInteger;
public class ExpensiveFunction implements Computeable<String,BigInteger> {
//真正用来负责计算的类
@Override
public BigInteger compute(String arg) throws InterruptedException {
//after deep thought 呵呵 外国人真幽默
return new BigInteger(arg);
}
}
import java.util.HashMap;
import java.util.Map;
/*
* 版本1 备忘录的技术
*/
public class Memorizer1<A, V> implements Computeable<A, V> {
private Computeable<A,V> c ; //真正负责计算的对象 组合的设计模式
private Map<A,V> cache = new HashMap<A,V>(); //缓存
public Memorizer1(Computeable<A, V> c) {
this.c = c;
}
@Override
public synchronized V compute(A arg) throws InterruptedException {
V result = cache.get(arg);
if(result != null) {
return result;
}
result = c.compute(arg);
cache.put(arg, result);
return result ;
}
}
//这样做 并发性很低....
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/*
* 版本2 备忘录的技术
*/
public class Memorizer2<A, V> implements Computeable<A, V> {
private final Computeable<A,V> c ; //真正负责计算的对象 组合的设计模式
private final Map<A,V> cache = new ConcurrentHashMap<A,V>(); //缓存
public Memorizer2(Computeable<A, V> c) {
this.c = c;
}
@Override
public V compute(A arg) throws InterruptedException {
V result = cache.get(arg);
if(result != null) {
return result;
}
result = c.compute(arg);
cache.put(arg, result);
return result ;
}
}//使用了ConcurrentHashMap
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
/*
* 版本3 备忘录的技术
*/
public class Memorizer3<A, V> implements Computeable<A, V> {
private final Computeable<A, V> c; // 真正负责计算的对象 组合的设计模式
private final Map<A, Future<V>> cache = new ConcurrentHashMap<A, Future<V>>();
//将一个线程作为 值放入map 这个线程可以有返回值
// f.get() 是一个阻塞的方法 等待计算线程完成
public Memorizer3(Computeable<A, V> c) {
this.c = c;
}
@Override
public V compute(final A arg) throws InterruptedException {
Future<V> task = cache.get(arg);
if (task == null) {
Callable<V> eval = new Callable<V>() {
@Override
public V call() throws Exception {
return c.compute(arg);
}
};
FutureTask<V> ft = new FutureTask<V>(eval);
task = ft;
cache.put(arg, task);
ft.run(); // 调用c.compute 发生在这里 在本线程中执行
}
try {
return task.get();
} catch (ExecutionException e) {
// throw launderThrowable(e.getCause()); 这里的异常处理不合理 我不知道怎么做s
return null;
}
}
}
分享到:
相关推荐
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代多核处理器环境下不可或缺的技术,它能够充分利用系统资源,提高程序的执行效率。以下将详细阐述Java并发编程的一些关键知识...
### Java并发编程实践知识点详解 #### 一、Java并发编程基础 ##### 1.1 并发与并行概念区分 在Java并发编程实践中,首先需要理解“并发”与“并行”的区别。“并发”指的是多个任务同时进行,但实际上可能是在多...
根据提供的文档内容,我们可以归纳并深入探讨Java并发编程的一些核心概念和原理,这些知识点对于理解和实践Java并发编程至关重要。 ### JVM内存模型 JVM内存模型是理解Java并发的基础。主要包含以下几个部分: ##...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...
本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...
《Java并发编程实践》是一本深入探讨Java平台并发编程的权威著作。这本书旨在帮助开发者理解和掌握如何有效地在多线程环境中编写高效的、可维护的代码。以下是对书中的主要知识点的详细阐述: 1. **并发基础**:...
Java并发编程是Java语言中最为复杂且重要的部分之一,它涉及了多线程编程、内存模型、...随着硬件性能的持续提升和应用需求的多样化,Java并发编程的实践和理论研究将不断深化,为开发高性能、高可用性的系统提供支持。
《JAVA并发编程实践》是一本关于Java多线程编程技术的书籍,由多位在Java并发编程领域有深厚背景的专家共同撰写。该书内容详尽,不仅深入讨论了并发编程的基础理论,还提供了大量实战技巧和案例分析,对于希望提高...
5.6 为计算结果建立高效、可伸缩的高速缓存 第2部分 构建并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 ...
根据提供的文件信息,“JAVA并发编程实践.pdf”,我们可以深入探讨与Java并发编程相关的多个核心知识点,这对于希望深入了解并行处理机制、提升程序性能的开发者来说至关重要。下面将详细展开这些知识点。 ### Java...
Java并发编程是Java开发中的重要领域,它涉及到多线程、同步机制、线程池以及并发集合等核心概念。在Java中,并发编程是提高系统性能和资源利用率的关键技术,尤其是在处理大量I/O操作或者计算密集型任务时。本文将...
根据提供的信息,我们可以推断出该资源主要关注的是“Java并发编程实践”的相关内容,并且它是一本高清晰度的PDF电子书。虽然提供的链接部分似乎只是重复的网站地址,我们仍可以根据标题、描述以及标签来生成相关的...
### Java并发编程的艺术 #### 一、并发编程的挑战与应对策略 本书开篇即指出,随着现代计算机系统越来越依赖于多核处理器的并行计算能力,Java开发人员面临着前所未有的并发编程挑战。这些挑战包括但不限于数据...