JDK

Java8新特性之Lambda表达式

≡放荡痞女 提交于 2021-01-05 14:00:57
lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁。最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java8新特性的第一篇,将探讨行为参数化、lambda表达式,以及方法引用。 一. 行为参数化 行为参数化简单的说就是函数的主体仅包含模板类通用代码,而一些会随着业务场景而变化的逻辑则以参数的形式传递到函数之中,采用行为参数化可以让程序更加的通用,以应对频繁变更的需求。 考虑一个业务场景,假设我们需要通过程序对苹果进行筛选,我们先定义一个苹果的实体: package com.lance.code.generation.java8; import java.awt.*; /** * Created by wangwei on 2016/11/2. */ public class Apple { /** 编号 */ private long id; /** 颜色 */ private Color color; /** 重量 */ private float weight; /** 产地 */ private String origin; public Apple() { } @Override public String toString() { return "Apple{" + "id="

IDEA中无法import自己工程中类的问题解决方法

邮差的信 提交于 2021-01-05 13:34:09
今天开个很久没搞的工程,刚开的时候一片红,很自然的想到,要去配置一下项目的JDK,但是配置好之后,又出了个诡异问题:项目可以运行,但是import项目内部自己写的类的时候,都出现了红色错误。虽然import显示错误,但是实际类是存在的!! 就像下面这样: 那么碰到这类问题之后要如何解决呢?下面说说解决步骤: 第一步 :菜单中选择File - Invalidate Caches/Restart... 第二步 :在弹出框中,选择Invalidate and Restart 本文首发: https://blog.didispace.com/idea-import-project-class-failed/ ,转载注明出处。 静静等待IDEA重启,此时就可以看到红色import错误没有啦! 欢迎关注我的公众号:程序猿DD,获得独家整理的免费学习资源助力你的Java学习之路!另每周赠书不停哦~ 来源: oschina 链接: https://my.oschina.net/didispace/blog/4878475

再谈synchronized

独自空忆成欢 提交于 2021-01-05 10:23:21
1.synchronized如何实现同步的? 2.synchronized对象锁保存在哪里? 3.如何加锁和释放锁,1.6做了哪些优化? 4.如何将线程挂起等待和唤醒? 对象内置锁 我们 之前 了解过synchronized同步普通方法和静态方法,以及同步代码块,其中的区别在于synchronized具体锁的是那个对象,是具体的实例还是类对象,即class 我们通过反编译:javap -verbose SynchronizedTest.class >sync.txt。可以看出使用synchronized之后的一些细微的变化,方法上的同步关键字,class文件反编译后会发现flags中有ACC_SYNCHRONIZED标识。 1.方法 级的 同步是隐式的:同步方法的常量池中会有一个ACC_SYNCHRONIZED标志。当某个线程要访问某个方法的时候,会检查是否有ACC_SYNCHRONIZED,如果有设置,则需要先获得对象的内置锁,然后开始执行方法,方法执行之后再释放锁。 2.同步代码块:依赖monitorenter和monitorexit相关标识,通过JVM内置锁对象来实现加锁和释放锁。 对象头信息简介:首先每一个对象在堆内存中,实例对象会有对象头信息,对象实体信息,还有填充信息。其中头信息中包括锁状态,GC年纪,Hash值和监控monitor对象的引用等信息

数据结构与算法笔记(二)

五迷三道 提交于 2021-01-05 07:34:03
跳表 前面的数据结构笔记中分析过链表,如图所示: 由于它的内存空间非连续,因此查找某个元素时只能从头到尾遍历,时间复杂度为 O(n)。 那么能不能提高链表的查找效率呢? 我们可以对链表进行改造,在链表上建立一级“索引”,如图: 这样,在查找的时候就可以先在索引层查找,然后再根据索引去查数据(有点类似数据库的索引)。 为了进一步提高查找效率,还可以建立二级索引,如图: 以此类推,还可以建立更多层级的索引: 这种数据结构称为跳表( Skip List )。这样做查找速度更快了,但同时也会耗费更多的存储空间,它的思想其实就是空间换时间。 应用场景:Redis 的有序集合。 散列表 散列表( Hash table ),又称“哈希表”或“ Hash 表”。利用的是数组支持按照下标访问数据(时间复杂度为 O(1) )的特性,是数组的一种扩展。示意图: 其中的 key 为可理解为要存入的数据的键(键-值对形式); hash() 是「散列函数」, 它根据 key 计算得到一个非负整数, 是哈希表实现的一个关键点 ; table 为存放数据的数组。 散列表存入数据的大概流程是:将 key 经过散列函数计算得到一个值(保证在数组长度范围内)作为数组的下标,然后将 key 的值保存在数组下标对应的位置。 散列函数 散列函数设计的基本要求: 1. 散列函数计算得到的散列值是一个非负整数(数组下标从 0

线程终止

泄露秘密 提交于 2021-01-05 07:33:41
线程终止 不正确的线程终止 - stop stop: 终止线程, 并且清楚监视器锁的信息, 但是可能导致线程安全问题, JDK不建议使用 正确的线程终止 - interrupt 如果目标线程在调用Object class的wait方法, join方法或sleep方法时被阻塞, 那么interrupt会生效, 该线程的中断状态将被清除,抛出InterruptedException 如果目标线程是被I/O或者NIO的Channel所阻塞,, 同样I/O操作会被中断或者返回特殊异常, 达到终止线程的目的 如果以上条件都不满足, 则会设置此线程的状态为中断状态 代码示例: public class StopThread extends Thread { private int i = 0, j = 0; @Override public void run() { synchronized (this) { // 增加同步锁,确保线程安全 ++i; try { // 休眠10秒,模拟耗时操作 Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } ++j; } } /** * 打印i和j */ public void print() { System.out.println("i=" + i

Dubbo面试题(2020最新版)

不问归期 提交于 2021-01-05 01:42:02
基础知识 为什么要用 Dubbo? 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了。 Dubbo 是什么? Dubbo 是一款高性能、轻量级的开源 RPC 框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 Dubbo 的使用场景有哪些? 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 Dubbo 核心功能有哪些? Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 Registry:服务注册,基于注册中心目录服务

Netty面试题(2020最新版)

扶醉桌前 提交于 2021-01-05 01:18:27
1.Netty 是什么? Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活。 2.Netty 的特点是什么? 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。 传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。 封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。 3.Netty 的优势有哪些? 使用简单:封装了 NIO 的很多细节,使用更简单。 功能强大:预置了多种编解码功能,支持多种主流协议。 定制能力强:可以通过 ChannelHandler 对通信框架进行灵活地扩展。 性能高:通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优。 稳定:Netty 修复了已经发现的所有 NIO 的 bug,让开发人员可以专注于业务本身。 社区活跃:Netty 是活跃的开源项目,版本迭代周期短,bug 修复速度快。 4.Netty 的应用场景有哪些? 典型的应用有:阿里分布式服务框架 Dubbo,默认使用 Netty 作为基础通信组件,还有 RocketMQ

Java 14 Hotspot 虚拟机垃圾回收调优指南!

人走茶凉 提交于 2021-01-05 00:24:33
作者:大鹏123 www.cnblogs.com/sxpujs/p/12638114.html 优化目标与策略(Ergonomics) 垃圾收集器、堆和运行时编译器默认选择 G1(Garbage First)收集器 GC线程的最大值受限于堆大小和可用的CPU资源 初始堆空间为物理内存的1/64 最大堆空间为物理内存的1/4 分层编译器,同时使用C1和C2 可以将 Java HotSpot VM 垃圾收集器配置为优先满足两个目标之一:最大暂停时间和应用吞吐量。如果首选目标得到满足,收集器将尝试最大化其他目标。 最大暂停时间目标(Maximum Pause-Time Goal) 暂停时间是垃圾收集器停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标的意图是限制这些暂停的最长时间。 使用命令行选项 -XX:MaxGCPauseMillis=指定最大暂停时间目标。这被解释为向垃圾回收器提示,需要的暂停时间为 nnn 毫秒或更短。垃圾收集器调整 Java 堆大小和其他与垃圾收集相关的参数,以使垃圾收集暂停时间小于 nnn 毫秒。最大暂停时间目标的缺省值随收集器的不同而变化。这些调整可能会导致垃圾收集更频繁地发生,从而降低应用程序的总吞吐量。但是,在某些情况下,暂停时间的预期目标无法实现。 吞吐量目标(Throughput Goal) 吞吐量目标是根据收集垃圾所花费的时间来度量的

Java 14 Hotspot 虚拟机垃圾回收调优指南!

杀马特。学长 韩版系。学妹 提交于 2021-01-05 00:24:18
Java技术栈 www.javastack.cn 打开网站看更多优质文章 作者:大鹏123 出处:www.cnblogs.com/sxpujs/p/12638114.html 优化目标与策略(Ergonomics) 垃圾收集器、堆和运行时编译器默认选择 G1(Garbage First)收集器 GC线程的最大值受限于堆大小和可用的CPU资源 初始堆空间为物理内存的1/64 最大堆空间为物理内存的1/4 分层编译器,同时使用C1和C2 可以将 Java HotSpot VM 垃圾收集器配置为优先满足两个目标之一:最大暂停时间和应用吞吐量。如果首选目标得到满足,收集器将尝试最大化其他目标。 最大暂停时间目标(Maximum Pause-Time Goal) 暂停时间是垃圾收集器停止应用程序并恢复不再使用的空间的持续时间。最大暂停时间目标的意图是限制这些暂停的最长时间。 使用命令行选项 -XX:MaxGCPauseMillis=指定最大暂停时间目标。这被解释为向垃圾回收器提示,需要的暂停时间为 nnn 毫秒或更短。垃圾收集器调整 Java 堆大小和其他与垃圾收集相关的参数,以使垃圾收集暂停时间小于 nnn 毫秒。最大暂停时间目标的缺省值随收集器的不同而变化。这些调整可能会导致垃圾收集更频繁地发生,从而降低应用程序的总吞吐量。但是,在某些情况下,暂停时间的预期目标无法实现。 吞吐量目标

【译】Java 14 Hotspot 虚拟机垃圾回收调优指南

梦想与她 提交于 2021-01-04 22:14:50
本文主要包括以下内容: 优化目标与策略(Ergonomics) 垃圾收集器实现(Garbage Collector Implementation) 影响垃圾收集性能的因素 总堆(Total Heap) 年轻代 可用的收集器(Available Collectors) 串行收集器(Serial Collector) 并行收集器(Parallel Collector) G1收集器(Garbage-First Garbage Collector) Z收集器(The Z Garbage Collector) 选择收集器选择收集器 并行收集器 G1垃圾收集器 启用G1 基本概念 G1内部细节 G1 GC的默认选项 与其它收集器的比较 Z垃圾收集器 其它考虑因素 显式垃圾回收 类元数据(Class Metadata) 优化目标与策略(Ergonomics) 垃圾收集器、堆和运行时编译器默认选择 G1(Garbage First)收集器 GC线程的最大值受限于堆大小和可用的CPU资源 初始堆空间为物理内存的1/64 最大堆空间为物理内存的1/4 分层编译器,同时使用C1和C2 可以将 Java HotSpot VM 垃圾收集器配置为优先满足两个目标之一:最大暂停时间和应用吞吐量。 如果首选目标得到满足,收集器将尝试最大化其他目标。 最大暂停时间目标(Maximum Pause-Time Goal