摘要:
我们关注的操作有:get,put,remove 这3个操作。 对于哈希表,Java中采用链表的方式来解决hash冲突的。一个HashMap的数据结构看起来类似下图: 实现了同步的HashTable也是这样的结构,它的同步使用锁来保证的,并且所有同步操作使用的是同一个锁对象。这样若有n个线程同时在ge 阅读全文
摘要:
前言 提到双重检查锁(Double-Checked Locking)通常简称为DCL,肯定很多人第一时间想到的就是单例模式。 单例模式通常有两种方式:饿汉与懒汉模式。那么懒汉模式采用了延迟初始化来降低类创建造成的消耗,DCL是常见的延迟初始化技术,但它是一个错误的用法。下面来详细分析以下这种 阅读全文
摘要:
前言我们常用的创建线程方式一般有下面 2 种: 继承Thread,重写run方法实现Runnable接口,重新run方法其实在 Executor 框架中还有一种方法可以实现异步,那就是实现 Callable 接口并重写call方法。虽然是实现 Callable ,但是在 Executor 实际运行时 阅读全文
摘要:
hreadPoolExecutor提供了四个构造方法: 我们以最后一个构造方法(参数最多的那个),对其参数进行解释: public ThreadPoolExecutor(int corePoolSize, // 1 int maximumPoolSize, // 2 long keepAliveTi 阅读全文
摘要:
多线程环境下,HashMap扩容会导致死锁,下面图解过程: 并发下的Rehash(多线程)1)假设我们有两个线程,都执行以下扩容代码。 do { Entry<K,V> next = e.next; // <--假设线程一执行到这里就被调度挂起了,执行其他操作 int i = indexFor(e.h 阅读全文
摘要:
Collection | ├AbstractCollection 对Collection接口的最小化抽象实现 | │ | ├List 有序集合 | │-├AbstractList 有序集合的最小化抽象实现 | │-├ArrayList 基于数组实现的有序集合 | │-├LinkedList 基于链表 阅读全文
摘要:
一.java io流 概况 按照技术体系分为BIO、NIO、AIO 每种技术体系都有以下分类 1. 流内容角度分类: 1.字节流 > 输入或者输出都是字节。 2.字符流 > 输入或者输出都是字符,相比字节流,其实是多做一步,自动把字符转换成字节或者把字节转换为字符(涉及到字符集或者操作系统默认字符集 阅读全文
摘要:
一.背景 java的比较器有两类,分别是Comparable接口和Comparator接口。 二.代码示例 1.Comparator代码 //构造一个排序比较器 Comparator comparator = new Comparator<String>() { @Override public i 阅读全文
摘要:
1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.length); 输出的结果是字符串长度10。 2 charAt()截取一个字符 String a = "Hello Word"; System.out.println(a 阅读全文
摘要:
一.背景 针对对象的某个接口,动态生成该对象的代理,增加对象被调用之前和之后的控制逻辑。 二.代码示例 public static interface Student {//接口 void exam(); } public static class MiddleSchoolStudent imple 阅读全文