jdk8

ConcurrentHashMap总结

不羁岁月 提交于 2020-04-17 03:25:23
【推荐阅读】微服务还能火多久?>>> 并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,无论对于Java并发编程的学习还是Java内存模型的理解,ConcurrentHashMap的设计以及源码都值得非常仔细的阅读与揣摩。 这篇日志记录了自己对ConcurrentHashMap的一些总结,由于JDK6,7,8中实现都不同,需要分开阐述在不同版本中的ConcurrentHashMap。 之前已经在 ConcurrentHashMap原理分析 中解释了ConcurrentHashMap的原理,主要是从代码的角度来阐述是源码是如何写的,本文仍然从源码出发,挑选个人觉得重要的点(会用红色标注)再次进行回顾,以及阐述ConcurrentHashMap的一些注意点。 1. JDK6与JDK7中的实现 1.1 设计思路 ConcurrentHashMap采用了 分段锁 的设计

JDK8学习笔记-Function接口

陌路散爱 提交于 2020-04-09 11:11:21
学习JDK8新特性,必不可少的就是函数式编程,那也就不得不了解Function接口的使用了。 首先看下Function接口的定义 @FunctionalInterface public interface Function<T, R>{ /** * Applies this function to the given argument. * * @param t the function argument * @return the function result */ R apply(T t); // 省略其他方法 } 接口定义了两个泛型,在使用的时候需要指定。 该接口中比较重要的就是这个apply方法,其参数是类型T,返回时类型R(可能这么描述不太合适) 接下来看下Map中的新方法(该方法的详解可以参考我的另一篇博客 https://my.oschina.net/simpleton/blog/1552737 ) default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { Objects.requireNonNull(mappingFunction); V v; if ((v = get(key)) == null) { V newValue; if ((newValue

ConcurrentHashMap源码解析(1.8)

末鹿安然 提交于 2020-03-20 07:58:47
一、简介 上篇文章 详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理。 首先在看本文之前,希望对HashMap有一个详细的了解。不然看直接看ConcurrentHashMap的源码还是有些费劲的。 相信对HashMap,HashTable有一定了解,应该知道HashMap是不具备线程安全性的,在resize时会丢数据(JDK8),而HashTable虽然保证了线程安全性,但是其是通过给每个方法加Synchronized关键字达到的同步目的。但是都知道Synchronized在竞争激烈的多线程并发环境中,在性能上的表现是非常不如人意的。那在高并发环境中HashMap如何保证线程安全而又不浪费太多性能呢?答案就是Java J.U.C并发包中的ConcurrentHashMap。 依然开局一张图。JDK8中的ConcurrentHashMap数据结构。 呃呵,和HashMap的结构是一样的,没错在数据结构层面,ConcurrentHashMap和HashMap是完全一样的。有了这个基础继续往下看。 二、历史版本 ConcurrentHashMap的历史版本大致分界线在JDK8。也就是可以分为JDK8和JDK8以前版本。 数据结构的区别 在JDK8之前HashMap没有引入红黑树,同样的ConcurrentHashMap也没有引入红黑树

Spring boot:@Value 找不到值,或启动报异常

泄露秘密 提交于 2020-03-05 18:39:47
C:\Java\jdk8\bin\java.exe -agentlib:jdwp = transport = dt_socket,address = 127.0.0.1:61122,suspend = y,server = n -XX:TieredStopAtLevel = 1 -noverify -Dspring.output.ansi.enabled = always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 61121 -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false -Djava.rmi.server.hostname = localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled = true -javaagent:C:\JetBrains\IntelliJIDEA\lib\rt\debugger-agent.jar = file:/C:/Users/UYUN/AppData/Local/Temp/capture.props -Dfile

要通过面试,Lamdba要了解多少?

不想你离开。 提交于 2020-03-02 12:40:08
Jdk8已经不算个什么新玩意了,但总体来说,JDK8也算是个大的改动,增加了很多新玩意,比如Lamdba、StreamApi、新的时间处理方式、还有接口方面的新改动。其中比较新颖的要算Lamdba呢,lamdba那怪异的语法,初略的看上去还真有点莫名其妙,那么到底lamdba是什么玩意呢? 匿名委托(匿名内部类) 我并没打算百度一下详细的讲解lamdba的概念是什么,先大概了解他有什么用,对我们有什么好处,然后再由你决定是否在以后的工作中用上lamdba吧。 从哪里开始讲呢?从我们工作组经常用的匿名委托谈起…… 匿名委托是什么玩意呢?其实就是我们经常会用到的“匿名内部类” 举个栗子,我们精彩用的线程,创建线程有好几种方法,那么用传统的。 new Thread(new Runnable() { @Override public void run() { System.out.println("嗯,没错,这是个匿名内部类"); } }).start(); 上面的写法对于你来说应该再熟悉不过了,如果连这都不熟悉,那么请客官还是先打好java的基础吧,可以加群523916260,我们再细讨论。 好像有点偏题了,我们继续说。 仔细看上面,上面那段代码是从IDEA里面截图的,细看我们发现上面有段灰色的波浪线,我们把鼠标放到那灰色的上面,会发现。 翻译一下:匿名内部类可以用Lamdba表达式代替

CentOS7安装JDK8

﹥>﹥吖頭↗ 提交于 2020-03-01 12:32:22
目录 一、下载JDK8压缩包 二、解压压缩包到指定目录 三、/etc/profile文件配置环境变量 四、重新加载/etc/profile文件 五、查看JDK8是否成功安装 一、下载JDK8压缩包 二、解压压缩包到指定目录 tar -zxvf jdk-8u162-linux-x64.tar.gz -C /usr/java/ 三、/etc/profile文件配置环境变量 修改/etc/profile文件 vi /etc/profile 在/etc/profile文件最后添加环境变量: JAVA_HOME=/usr/java/jdk1.8.0_162 CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH 四、重新加载/etc/profile文件 source /etc/profile 五、查看JDK8是否成功安装 java -version 来源: CSDN 作者: apereo 链接: https://blog.csdn.net/nullAndUndefined/article/details/104587935

Win7下如何安装切换jdk7和jdk8

北战南征 提交于 2020-02-26 06:25:36
一、安装好JDK1.7和1.8。 二、配置环境变量: 1. 创建三个JAVA_HOME。JAVA7_HOME,存放JDK7的安装路径。JAVA8_HOME,存放JDK8的安装路径。JAVA_HOME,如果需要jdk7版本变量值设为%JAVA7_HOME%,如果需要jdk8版本变量值设为%JAVA8_HOME%,便于切换。 2. 配置CLASSPATH。新建,变量名CLASSPATH,变量值,.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(第一个分号前前面有一个点)。 3. 配置Path。注意!一定要在Path变量值最前加入%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 4. 在安装JDK8时(我的电脑是先安装jdk7再安装的jdk8),会将java.exe、javaw.exe、javaws.exe三个可执行文件复制到了C:\Windows\System32目录,这个目录在WINDOWS环境变量中的优先级高于JAVA_HOME设置的环境变量优先级,所以要将这个目录中这三个文件删除。 注意: 如果 系统变量中的Path 中有 C:\ProgramData\Oracle\Java\javapath; ,删除之。否则会引变量错误。 三、验证,切换JAVA_HOME内不同的变量值。打开cmd,输入java -version

迅速看一下jdk8

吃可爱长大的小学妹 提交于 2020-02-12 02:40:22
  一直在看java并发的感觉说的有点多,就看点简单的放松一下吧!这次来简单说一下jdk8,很久没用,都陌生了,仔细看看还挺有意思的,让我们大脑转化一个角度来写代码;因为我们现在平常大部分用jdk7写代码,我们都是在想着这一步怎么做,下一步怎么做;而jdk8只需要知道这一步做什么,下一步做什么,思维的转换很有意思;   首先说说什么叫做行为参数化?简单的来说就是传递的是一个行为,可以想象成传递一个lambda表达式,其中lambda表达式就不多说了;   举个例子: package com.example.demo.vo; import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) public class Apple { private String color; private int weight; }   假如一个集合中有很多苹果,我们首先要筛选出重量大于10的苹果,那么我们需要定义一个这样的方法: static List<Apple> filterColor(List<Apple>inventory){ List<Apple> result = Lists.newArrayList(); for (Apple apple : inventory) { if

【Java】macOS下编译JDK8

北战南征 提交于 2020-02-05 10:03:22
安装mercurial brew install mercurial 下载源码 1234 hg clone http://hg.openjdk.java.net/jdk8/jdk8 java-sourcecd java-sourcechmod +x get_source.sh./get_source.sh 安装依赖 brew install freetype 修改源代码 1. 修改relocInfo.hpp的367行(hotspot/src/share/vm/code/relocInfo.hpp) 修改前: 1 inline friend relocInfo prefix_relocInfo(int datalen=0); 修改后: 1 inline friend relocInfo prefix_relocInfo(int datalen); 2. 修改generated-configure.sh的20061和21640行(common/autoconf/generated-configure.sh),解决 configure: error: GCC compiler is required 错误 修改前为: 1 as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5

简单看看LongAccumulator

半腔热情 提交于 2020-01-30 16:33:25
  上篇博客我们看了AtomicLong和LongAdder的由来,但是有的时候我们想一下,LongAdder这个类也有点局限性,因为只能是每一次都+1,那有没有办法每次+2呢?或者每次乘以2?说得更抽象一点,我们能不能自己指定规则呢?干嘛老是傻乎乎的+1呢?   于是就有了LongAccumulator这个累加器,这个累加器更加抽象,前面使用的LongAdder只不过是这个累加器的一个特例,由此我们可以猜出这个累加器功能更加强大,但是需要我们自己的定制规则;   前提:看本篇博客的人应该熟悉jdk8中的函数式编程,jdk8是在2014年3月18日就推出了,到现在已经将近6年了,但是我们还是很多人在用着jdk8写着jdk7版本的代码,哎,无力吐槽!既然不能改变别人就改变自己吧! 一. 简单使用LongAccumulator累加器   我们先看看这个累加器的构成,如下所示: public class LongAccumulator extends Striped64 implements Serializable { //这是一个函数式接口,函数描述符是(T,T)->T ,两个相同类型的数据按照某种规则运算,返回相同类型的数据 private final LongBinaryOperator function; //这个是累加器的初始值,也就是相当于LongAdder的base字段