Amy's Blog

这是副标题

  • 首页
  • 归档
  • 分类
  • 标签

函数式接口

发表于 2020-11-25 | 分类于 Java | 阅读次数

Jdk8 新增一个重要的包:java.util.function。该包下所有的接口都是函数式接口:@FunctionalInterface。

主要分为四大类:Supplier、Consumer、Predicate、Function。

接口 方法 参数 返回值 说明
Supplier T get(); 无 T 供给型;无参,返回一个指定泛型的对象
Consumer void accept(T t); T 无 消费型;传入一个指定泛型的参数,无返回值
Predicate boolean test(T t); T Boolean 断言型:输入一个参数,返回判断结果
Function<T, R> R apply(T t); T R 方法型;输入一个参数,得到一个结果

如果T/R为int/long/double,该包下定义了相关接口,如IntSupplier、IntConsumer、IntFunction、IntPredicate……

阅读全文 »

缓存穿透、雪崩、热点key集中失效等问题

发表于 2020-11-21 | 分类于 Java | 阅读次数

一、缓存穿透

1.1 概念

  • 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中。

通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层,整个过程分为如下3步:

1)缓存层不命中。

2)存储层不命中,不将空结果写回缓存。

3)返回空结果。

缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。

阅读全文 »

final关键字及final域的内存语义

发表于 2020-11-19 | 分类于 Java | 阅读次数

final 关键字可以声明成员变量、方法、类以及本地变量。

通过为final域增加写和读重排序规则,可以为Java程序员提供初始化安全保证:只要对象是正确构造的,不需要使用同步(指lock和volatile的使用)就可以保证任意线程都能看到这个final域在构造函数中被初始化之后的值。

阅读全文 »

限流算法

发表于 2020-11-17 | 分类于 Java | 阅读次数

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。

在高并发系统中,限流通常指的是对请求进行限速,一旦达到系统的限速规则(比如系统限制的请求速度),则可以采取一些措施来完成限制流量的目的:

  • 拒绝处理(友好提示或者跳转到错误页面)
  • 延迟处理(排队或等待,比如秒杀系统)
  • 服务降级(返回默认的兜底数据)

一、限流算法

常见的限流算法有:计数器、漏桶和令牌桶算法。

阅读全文 »

从put()分析HashMap

发表于 2020-11-10 | 分类于 Java | 阅读次数

1、它是有序的集合

实现了 SotredMap 接口:

1
2
3
4
5
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable{//...}

public interface NavigableMap<K,V> extends SortedMap<K,V> {//...}

2、在调用 TreeMap 的构造函数时:

1)若指定了 Comparator 比较器,按照比较器来进行 key 的排序。

1
2
3
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}

2)若未指定 Comparator 比较器,则按照 key 进行自然排序,key 必须实现 Comparable 接口。

阅读全文 »

CountDownLatch

发表于 2020-11-07 | 分类于 Java | 阅读次数

jdk1.5 之后,java 的 concurrent 包提供了一些并发工具类,比如 CountDownLatch 和 CyclicBarrier

一、等待多线程完成的CountDownLatch。

CountDownLatch允许一个或多个线程等待其他线程完成操作,再继续执行。

阅读全文 »

Queue及其实现类

发表于 2020-08-20 | 分类于 Java | 阅读次数

概要

  • Queue是继承于Collection的接口,是FIFO的单端队列。

    • PriorityQueue实现了Queue,是优先队列。
  • Deque是继承于Queue的子接口,是双端队列。

    • LinkedList实现了Deque,是双向链表。
  • ArrayQueue实现了Deque,是用数组表示的小顶堆。

阅读全文 »

序列化

发表于 2020-06-28 | 分类于 Java | 阅读次数

一、作用

  • 序列化是指把一个 Java 对象变成二进制内容(字节序列),本质上就是一个 byte[] 数组。

    将数据从程序 (内存) 中写到磁盘、光盘等存储设备中,输出流。

    为什么要把 Java 对象序列化呢?因为序列化后可以把 byte[] 保存到文件中,或者把 byte[] 通过网络传输到远程,这样,就相当于把 Java 对象存储到文件或者通过网络传输出去了。

  • 反序列化,即把二进制内容(也就是 byte[] 数组)恢复为原先的 Java 对象。

    读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中,输入流

    有了反序列化,保存到文件中的 byte[] 数组又可以 “变回” Java 对象,或者从网络上读取 byte[] 并把它 “变回” Java 对象。

二、实现:使用ObjectInputStream 和 ObjectOutputStream

阅读全文 »

Comparable和Comparator

发表于 2020-06-20 | 分类于 Java | 阅读次数

1、Comparable接口

1
2
3
4
5
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}

列表和数组中的对象,如果实现了Comparable接口,就能直接通过Collections.sort(List)和Arrays.sort(Object[])进行排序。

实现了Comparable接口的对象,可以用作SortedMap中的键或SortedSet排序集中的元素,且无需指定 Comparator比较器。

阅读全文 »

Hook(钩子)线程

发表于 2020-06-05 | 分类于 Java | 阅读次数

一、关闭钩子介绍

处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。

Java shutdown hook 很方便在程序退出时运行一些代码。我们可以使用 java.lang.addshutdownhook (Thread hook) 方法在 JVM 中添加 shutdown hook。

在 JVM 程序即将退出的时候,Hook 线程就会被启动执行。

1、java.lang.Runtime.addShutdownHook(Thread hook) 方法

1
public void addShutdownHook(Thread hook){//省略...}

hook: 初始化但未启动的 Thread 对象。

可以通过调用静态工厂方法 getRuntime() 来获取 Runtime 类的对象。

阅读全文 »
12…5
Amy

Amy

42 日志
9 分类
25 标签
GitHub
Links
  • 阿里中间件团队博客
  • Jark's Blog
  • 廖雪峰个人网站
© 2020 Amy
由 Hexo 强力驱动
主题 - NexT.Mist
本站总访问量 次    本站访客数人次

Hosted by Coding Pages