- 浏览: 1783326 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (528)
- java基础 (35)
- oracle (23)
- 项目管理 (10)
- 代码架构 (27)
- java线程与进程 (2)
- 盈利模式 (10)
- 性能测试 (1)
- Ophone (2)
- web (6)
- asp (0)
- php (1)
- c# (1)
- Ruby (0)
- jboss (4)
- java基础之面试篇 (7)
- 数据查询优化 (1)
- weblogic (3)
- EJB (1)
- EXT (6)
- jquery (8)
- struts2 (2)
- struts1 (1)
- css (1)
- javascript (4)
- SSI (9)
- linux (9)
- c++ (6)
- 网络安全 (3)
- swing (2)
- 嵌入式 (1)
- 图像处理(机器人智能技术) (1)
- vb (2)
- mysql (2)
- sqlserver (10)
- dephi (0)
- Android (4)
- hadoop (1)
- maven (4)
- mybatis (1)
- html5 (1)
- 算法 (0)
- 高并发架构总结 (1)
- 时事评论 (4)
- 有些话不能不说 (35)
- 琴棋书画 (0)
- 教育 (1)
- 创业需要的 (4)
- 产品经理需要的 (4)
- 小南那些青涩的文章 (9)
- 如何创新 (4)
- 历史借鉴之秦汉 (1)
- 历史借鉴之三国 (1)
- 历史借鉴之魏晋 (1)
- 历史借鉴之隋唐 (1)
- 历史借鉴之南北宋 (1)
- 历史借鉴之近现代史 (1)
- 好工具我来推荐 (4)
- 汇编 (14)
最新评论
-
bilimeng:
求教,ConcurrentHashMap不是线程安全的么,为啥 ...
架构师之jdk8-----------------ConcurrentHashMap快速构建本地缓存和单例模式 -
baiducctv5:
wtaisi 写道wtaisi 写道|||||||||
spring aop中的propagation的7种配置的意思 -
zhangdong92:
另外内存泄漏一般也不是指计算时溢出。而是指某些对象已经不再使用 ...
java基础之面试篇三---int,float,long,double取值范围,内存泄露 -
zhangdong92:
Long.MAX_VALUE应该是(2^63)-1,而不是64 ...
java基础之面试篇三---int,float,long,double取值范围,内存泄露 -
nannan408:
java-lxm 写道好湿好湿好湿谢谢: )。
游南巅之晚秋
1.前言。
本地缓存和复杂的单例写起来不仅效率低下,而且费时。ConcurrentHashMap+computeIfAbsent使得可以直接快速构建。
2.例子.
运行结果:
本地缓存和复杂的单例写起来不仅效率低下,而且费时。ConcurrentHashMap+computeIfAbsent使得可以直接快速构建。
2.例子.
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Main { static Map<Integer, Integer> cache = new ConcurrentHashMap<>(); public static void main(String[] args) throws InterruptedException { cache.put(0, 0); cache.put(1, 1); // 普通方式 System.out.println("Fibonacci(7) = " + fibonacci(7)); // 采用java7的同步线程方式及java8的本地缓存的方式 System.out.println("FibonacciJava8(7) = " + fibonacciJava8(7)); System.out.println("FibonacciJava7(7) = " + fibonacciJava7(7)); // 构建多值Map样例代码 Map<String, HashSet<String>> map1 = new HashMap<>(); map1.computeIfAbsent("fruits", k -> genValue(k)).add("apple"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("orange"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("pear"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("banana"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("water"); System.out.println(map1); //测试多线程并发处理,是否同步操作 Map<String, String> map2 = new ConcurrentHashMap<>(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { exec.execute(() -> { map2.computeIfAbsent("name", k -> genValue2(k)); map2.computeIfAbsent("addr", k -> genValue2(k)); map2.computeIfAbsent("email", k -> genValue2(k)); map2.computeIfAbsent("mobile", k -> genValue2(k)); }); } exec.shutdown(); exec.awaitTermination(1, TimeUnit.SECONDS); System.out.println(map2); } static HashSet<String> genValue(String str) { return new HashSet<String>(); } static String genValue2(String str) { System.out.println("==="); return str + "2"; } /** * 普通的实现方式 普通方式使用大量的计算,存在性能问题. 并且计算量随着n的增加呈指数级增加,需要用到一些缓存策略,并且是线程安全的. * * @param n * @return */ static int fibonacci(int n) { if (n == 0 || n == 1) return n; System.out.println("calculating Fibonacci(" + n + ")"); return fibonacci(n - 2) + fibonacci(n - 1); } /** * 采用java8的本地缓存方式 如果缓存MAP中不存在指定key的值,会自动调用mappingFunction(key)计算key的value * 然后将key = value放入到缓存Map,java8会使用thread-safe的方式从cache中存取记录 * * @param n * @return */ static int fibonacciJava8(int n) { return cache.computeIfAbsent(n, (key) -> { System.out.println("calculating FibonacciJava8 " + n); return fibonacciJava8(n - 2) + fibonacciJava8(n - 1); }); } /** * 在java7中的实现方式 * 在java7中,通过synchronized进行线程同步,检查缓存是否存在key对应的值,如果不存在才进行计算并放入缓存中 * 为了更好的性能,需要使用 double-checked locking,那样代码会更复杂 * * @param n * @return */ static int fibonacciJava7(int n) { if (n == 0 || n == 1) return n; Integer result = cache.get(n); if (result == null) { synchronized (cache) { result = cache.get(n); if (result == null) { System.out.println("calculating FibonacciJava7(" + n + ")"); result = fibonacciJava7(n - 2) + fibonacciJava7(n - 1); cache.put(n, result); } } } return result; } }
运行结果:
calculating Fibonacci(7) calculating Fibonacci(5) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(4) calculating Fibonacci(2) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(6) calculating Fibonacci(4) calculating Fibonacci(2) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(5) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(4) calculating Fibonacci(2) calculating Fibonacci(3) calculating Fibonacci(2) Fibonacci(7) = 13 calculating FibonacciJava8 7 calculating FibonacciJava8 5 calculating FibonacciJava8 3 calculating FibonacciJava8 2 calculating FibonacciJava8 4 calculating FibonacciJava8 6 FibonacciJava8(7) = 13 FibonacciJava7(7) = 13 {fruits=[orange, banana, apple, pear, water]} === === === === {name=name2, mobile=mobile2, addr=addr2, email=email2}
发表评论
-
架构师之jdk8-------------------集合互相转换集锦
2015-06-04 11:34 16691.前言. 如题.这里主要介绍list,map等常用集合的 ... -
架构师之hibernate-------------------mysql类型对应java转换
2015-06-02 18:29 16901.前言. 如题. 2.代码. Hibernat ... -
架构师之bean---------------bean之间的数据copy
2015-06-01 18:05 14871.前言. 如题,bean不能强转,只能对应转换.一共有 ... -
架构师之jetty使用----------------问题集锦
2015-05-27 10:11 14901.前言. 如题. 2.问题描述. (1)com.op ... -
架构师之json-----------通过path查找指定数据
2015-03-31 14:29 26931.前言 如题。 2.代码. imp ... -
架构师之mybatis-----timestamp转date丢失精度问题
2015-03-26 14:53 46211.前言. 如题. 2.问题描述. 如果mappe ... -
架构师之数字判断-----------------怎么判断一个字符串是个数字
2015-03-24 14:43 10071.前言. 如题. 2.代码. 方法1: publ ... -
架构师之enum枚举之(二)--------直接判断String是否属于枚举中的一个
2015-03-22 21:17 83571.前言。 如题。 2.代码。 enum E ... -
架构师之jdk的bug排查(一)---------------split的点号陷阱
2015-03-20 15:01 34161.前言. jdk1.6的lang包的split方法是有 ... -
架构师之enum枚举之(一)-----------如何判断枚举和字符串相等(最简便方法)
2015-03-20 10:47 81781.前言. 如题. 2.代码. (1)代码串 publ ... -
架构师之maven(三)---------junit测试可能遇到的问题
2015-03-18 10:31 18301.前言. 如题. 2.代码. (1)类型转换错误 (1) ... -
架构师之maven(二)junit4.11+spring4.1的测试配置
2015-03-16 17:15 37381.前言. maven的junit测试是需要遵守一些规则 ... -
spring官方下载地址
2015-03-16 10:10 1175SPRING官方网站改版后,建议都是通过 Maven和Grad ... -
java 序列化和反序列化(针对字符串的例子)
2014-11-04 14:09 42651.前言. 摘自:http://blog.csdn.ne ... -
架构师之Dos命令之setx-------常用来设置系统环境变量
2014-08-25 10:19 74761.前言。 如题。 2.内容。 用法为形如 @SET ... -
linux集群之----------设置磁盘缓冲参数
2014-07-29 10:59 71141.前言。 如题。linux ... -
spark+hadoop+cenos6.5+VitualBox4.3.6整合开发(一)安装centos6.5
2014-01-17 10:04 33341.前言。 首先先感谢cctv和http://zhou ... -
axis2-如何已知uri或者xml生成客户端?
2013-11-06 10:23 27381.前言 首先,需要下载axis2工具包,见附件,我这里是 ... -
让ie6,7,8支持canvas,css3等主流html5技术
2013-06-18 13:02 293961.前言。 ie6,7,8支持htm ... -
Ehcached等与Oscached的比较
2013-05-22 16:05 54861.前言. j2ee可以有很多Cache策略,Ehcach ...
相关推荐
jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8u361-linux-i586.tar.gz jdk-8u361-linux-x64.rpm jdk-8u361-linux-x64.tar.gz jdk-8u361-windows-i586.exe jdk-8u361-windows-x64.exe 如果需要mac版本...
jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...
赠送jar包:jackson-datatype-jdk8-2.13.1.jar; 赠送原API文档:jackson-datatype-jdk8-2.13.1-javadoc.jar; 赠送源代码:jackson-datatype-jdk8-2.13.1-sources.jar; 赠送Maven依赖信息文件:jackson-datatype-...
开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...
jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...
jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586
赠送jar包:bcprov-jdk14-1.38.jar; 赠送原API文档:bcprov-jdk14-1.38-javadoc.jar; 赠送源代码:bcprov-jdk14-1.38-sources.jar; 赠送Maven依赖信息文件:bcprov-jdk14-1.38.pom; 包含翻译后的API文档:bcprov...
这个压缩包 "jdk8-jdk-8u121-linux-x64.tar.gz" 包含了适用于Linux 64位系统的JDK 8更新121版本。** JDK是Java SE(Standard Edition)的一部分,它提供了Java编程语言和Java平台的开发环境。这个版本号“8u121”指...
标题中的“UOS服务器版MIPS架构龙芯openjdk-8-jdk-mips.tar.gz”指的是一款专为UOS(Unity Operating System)服务器版本设计的、基于MIPS架构的龙芯处理器优化的OpenJDK 8 JDK软件包。UOS是中国自主研发的操作系统...
赠送jar包:bcprov-jdk14-1.38.jar; 赠送原API文档:bcprov-jdk14-1.38-javadoc.jar; 赠送源代码:bcprov-jdk14-1.38-sources.jar; 赠送Maven依赖信息文件:bcprov-jdk14-1.38.pom; 包含翻译后的API文档:bcprov...
赠送jar包:bcmail-jdk14-1.38.jar; 赠送原API文档:bcmail-jdk14-1.38-javadoc.jar; 赠送源代码:bcmail-jdk14-1.38-sources.jar; 赠送Maven依赖信息文件:bcmail-jdk14-1.38.pom; 包含翻译后的API文档:bcmail...
8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-...
解决no such provider: BC 问题所需的JAR 在jdk中的jre\lib\security修改java.security文件, security.provider.6=com.sun.security.sasl.Provider 下面添加...bcprov-jdk16-143.jar提供加密,解密,生成密钥对等方法
标题中的"jdk-8u202-linux-arm64-vfp-hflt-demos.tar.gz"表明这是一个针对Linux ARM架构(具体为vfp-hflt变体)的Java Development Kit(JDK)版本8更新202的示例(demos)压缩包。这个压缩文件采用tar.gz格式,是...
赠送jar包:jackson-datatype-jdk8-2.11.4.jar; 赠送原API文档:jackson-datatype-jdk8-2.11.4-javadoc.jar; 赠送源代码:jackson-datatype-jdk8-2.11.4-sources.jar; 赠送Maven依赖信息文件:jackson-datatype-...
jdk-8版本安装包、 jdk-8版本安装包、 jdk-8版本安装包 jdk-8版本安装包、 jdk-8版本安装包、 jdk-8版本安装包 jdk-8版本安装包、 jdk-8版本安装包、 jdk-8版本安装包 jdk-8版本安装包、 jdk-8版本安装包、 jdk-8...
jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...
标题中的"bcprov-jdk16-146.jar"和"bcprov-jdk15-146.jar"是两个版本的Bouncy Castle提供者的Java档案(JAR)文件,用于加密和数字签名功能。Bouncy Castle是一个开源的Java加密库,它扩展了Java Cryptography ...
1. **下载JDK**: 首先,你需要从Oracle官方网站或者OpenJDK的源获取适用于ARM架构的JDK 8u391 Linux版的tar归档文件,即"jdk-8u391-linux-aarch64.tar"。 2. **解压JDK**: 使用`tar`命令解压缩下载的文件。例如: ...
标题中的"java-jdk1.8-jdk-8u192-windows-x64.zip"表明这是一个压缩包,内含64位的Java JDK 1.8u192版本,适用于Windows操作系统。这种格式的文件通常用于方便下载和传输大文件,用户需要先将其解压缩才能进行后续...