面经
...
CurrentHashMap
ConcurrentHashMap 类ConcurrentHashMap 1.7在JDK1.7中ConcurrentHashMap采用了数组+分段锁的方式实现。 Segment(分段锁)-减少锁的粒度 ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表,同时又是一个ReentrantLock(Segment继承了ReentrantLock)。 存储结构Java 7 版本 ConcurrentHashMap 的存储结构如图: ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可以进行扩容。 但是 Segment 的个数一旦初始化就不能改变,默认 Segment 的个数是 16 个,所以可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发。 初始化 通过 ConcurrentHashMap 的无参构造: 1234567/***...
软件架构设计复习
...
HashMap
HashMap 类 基础概念 定义 Hash 表也称为散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构。 哈希表,它是通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表,只需要 O(1) 的时间级 HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null,但 HashMap 中的映射不是有序的。 注意: 散列函数可能存在冲突,解决冲突有两种方法 开放寻址法:从冲突的位置开始,向后查找第一个可以插入的位置 拉链法:在冲突的位置后面追加节点使之成为链表 由于开放寻址法可能造成二次冲突,因此大多情况下采用拉链法解决 版本对比 JDK1.8 前 HashMap 的数据结构 JDK 8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。 当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,极端情况HashMap 就相当于一个单链表,假如单链表有 n...
线程池
线程回顾 创建线程的方式 继承 Thread 类 实现 Runnable 接口 创建后的线程有如下状态: NEW:新建的线程,无任何操作 123456public static void main(String[] args) { Thread thread = new Thread(() -> System.out.println(Thread.currentThread().getName() + "is running")); Thread.State state = thread.getState(); // 线程刚创建还未执行,状态为 NEW System.out.println(state); } RUNNABLE:可执行的线程,在 JVM 中执行但是在等待操作系统的资源 1234567public static void main(String[] args) { Thread thread = new Thread(() ->...
双Token解决方案
以往的项目大部分解决方案为单 token: 用户登录后,服务端颁发 jwt 令牌作为 token 返回 每次请求,前端携带 token 访问,服务端解析 token 进行校验和鉴权 存在的问题: 有效期设置问题:有效期设置需要对时间做平衡,不能太短也不能太长 续期问题:一旦过期,用户必须重新登录,很难做无感刷新 无状态问题:token 是无状态的,单 token 颁发后服务端无法主动使其失效 原理解析 这里引入双 token 机制: accessToken:时间较短,一般为 1天 refreshToken:时间较长,一般为 3 天 登录过程: 用户携带用户名和密码登录 服务端为其颁发 accessToken 和 refreshToken 三验证环节: 一验证:前端请求携带 accessToken,验证是否过期,不过期放行,过期则进入第二个验证环节 二验证:前端请求携带 refreshToken,验证是否过期,不过期进入第三个验证环节,过期则要求用户重新登录 三验证:对 ip 地址进行限流,对 refreshToken 解析 判断是否存在,存在则颁发新的...
设计模式
创建型单例单例模式分为两种,一种为饿汉式,一种为懒汉式, 饿汉式采用直接实例化 Singleton 的方式,但这样如果在不使用的情况下会消耗资源 懒汉式采用的后面实例化,从而达到节约资源,当有多个线程访问进去的时候,为了保证获取到的都是同一个 Singleton.class,通过对其进行上锁,保证只有一个线程可以进去获取实例化,当实例化结束后,其他线程获取到的都是已经被实例化好的singleton 12345678910111213141516171819202122public class Singleton { private static final Singleton instance = new Singleton(); private Singleton(){}; public static Singleton getInstance(){ return instance; }}class simple{ private static volatile...
力扣
排序148. 排序链表思想是归并排序 1234567891011121314151617181920212223242526272829public ListNode sortList(ListNode head) { if (head == null || head.next == null )return head; ListNode fast = head.next, slow = head; // 利用快慢指针移动中点 while(fast != null && fast.next != null){ fast = fast.next.next; slow = slow.next; } ListNode tmp = slow.next; slow.next = null; // 分为两边临界值,切割链表 ListNode left =...
Juc
Juc
面试总结
介绍一下你的XX项目? 介绍是什么? 青轻论坛是一个实现大学生交流平台,实现用户发帖交流评论,实现了富文本发帖、回帖以及楼中楼回复、点赞收藏、消息通知等功能 服务器监控运维系统是一个实时在线监控服务器运行状态以及详细信息的网站,能够做到服务器状态和信息监控、一键SSH远程登录、子用户分配具体服务器等操作 小马链接方便大学生分享网页提供便利简洁性,实现了跳转链接,链接数据记录,分组管理,链接修改灯功能 介绍主体功能?社区 进入系统前的注册 / 登录功能(JWT / rabbitmq发验证码 / redis存验证码) 最主要的帖子相关功能:富文本发帖 / 评论帖子 / 楼中楼回复 / 收藏点赞帖子 / 隐私展示 / 评论提醒 工具类...