11k 10 分钟

本文积累了我在(准备)面试的关于 Redis 的问题,当然我不喜欢背八股文,所以就会强迫自己去系统性学习, Redis 之前我开了一个 tag 的,但是没更完就要准备面试了,Java 后端岗位太卷了!! 大部分参考小林 Coding 以及敖丙的 JavaFamily # 通用篇 Redis 为什么这么快? 有几个方面的原因: 单线程执行,在 6.0 版本以前处理网络请求和数据操作都是单线程,减少了上下文切换,性能对于一些中小项目是完全足够的。网络请求处理使用的 IO 多路复用,数据处理因为是在内存中操作,CPU 资源并不会限制 Redis 性能。6.0...
2.8k 3 分钟

前言:本目录包含各种类型的 Galgame ,都是鄙人亲自玩过一遍写上的,并且根据个人主观评价分了等级的,请保持自己的思考,文明游戏,我只是个臭打游戏的。声明一下,可以标注来源的我会标注来源,标注不了的,大家各凭本事找资源吧。 恋爱类型:这也是 galgame 中最常见的类型,一般有很多可攻略女主,然后有一条主线。一般来说,当你选择了一条线之后,其他线的女主就是路人类型了(当然,他人世界末的赵诗线除外!!!),可能很多人觉得这种游戏设定有点显得男主博爱但是,我认为这算是 galgame...
4.7k 4 分钟

# 基础 1. 谈谈深拷贝和浅拷贝 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。 在 Object 类中,有个 clone() 方法,默认的就是浅拷贝,一个类想要重写 clone() 函数,需要实现 Cloneable 接口,自己实现深拷贝,就可以在 clone 函数中直接 new 就行。序列化也是深拷贝,这里直接给代码: class DeepClone implements Serializable { private static...
12k 11 分钟

本文积累了作者在准备面试时学习的计算机网络的知识与问题,作为科班出身,408 这些科目的重要性不必多说,能直接检验出你作为科班选手的水准。 1. 键入网址后依次发生了什么? 参考链接:https://mp.weixin.qq.com/s/I6BLwbIpfGEJnxjDcPXc1A 浏览器解析 URL 生成 Http 请求。 发送 Http 请求前,会将域名解析为 IP 地址,会先查询浏览器缓存、系统缓存、本机 hosts 文件,如果没有,就会发送请求到本地域名服务器,通过本地域名服务器分别访问根域名服务器、顶级域名服务器、权威域名服务器,最终拿到域名映射的 IP...
1.7k 2 分钟

java.util.concurrent.atomic 包,提供了很多原子操作类,这些类基本上都是使用 Unsafe 实现的包装类。 注意是包装类,类属性有: value , value 的地址偏移量等。 # 原子更新基本类型 atomic 包提供 boolean , int , long 的原子更新操作。以 AtomicInteger 为例讲解,常用方法为: addAndGet(int delta) :原子相加 compareAndSet(int except, int update) : cas 操作 getAndIncrement() :原子自增 lazySet(int...
2.8k 3 分钟

# CAS 我们希望在并发的过程中,先进行操作,如果没有其他线程争用共享数据,那么操作就成功了,否则就采取补偿措施。这种基于冲突检测的乐观的操作许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。 乐观锁需要操作和冲突检测这两个步骤具备原子性,这里的原子性不能够使用互斥同步来保证,只能靠硬件来完成。硬件支持的原子性操作最典型的是: 比较并交换 ( Compare-and-Swap,CAS )。 CAS 指令需要有 3 个操作数,分别是内存地址 V 、旧的预期值 A 和新值 B 。当执行操作时,只有当 V 的值等于 A ,才将 V 的值更新为 B 。 因为 CAS...
3.9k 4 分钟

# Fork/Join 框架 本文不会对源码部分涉及太多,主要是讲几个小例子来演示如何使用。 Fork/Join 框架是 Java 并发工具包中的一种可以将一个大任务拆分为很多小任务来异步执行的工具,该技术就是分治算法的并行实现,自 JDK1.7 引入。 该框架主要包含三个模块: 任务对象: ForkJoinTask 执行 Fork/Join 任务的线程: ForkJoinWorkerThread 线程池: ForkJoinPool 三者关系: ForkJoinPool 可以通过池中的 ForkJoinWorkerThread 来处理 ForkJoinTask...
6.9k 6 分钟

# 类结构 线程池也可以执行定时任务,以前如果要执行一个定时任务,需要用到 Timer 和 TimerTask ,但是它只是创建一个线程执行定时任务,无法多线程调度。 JDK1.5 之后可以使用 ScheduledThreadPoolExecutor : public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {}该类所有构造方法都要求线程池最大容量为 Integer.MAX_VALUE ,并且均采用...
8.6k 8 分钟

# 工具类 Executors 注意区别 Executor 类和 ExcetorService ,前者提供的是显式地创建线程运行提交过来的任务, ExecutorService 继承了 Executor ,多提供了管理终止方法和生成 Future 方法。但是创建出来的线程交给谁去运行的呢?接口只是规定了行为,而不会去管实现。 还是先看一下相关的类结构: Executors 就实现了创建线程池的操作(真的是 Executors 实现的吗?),通过 Executors 可以创建一些特定的线程池: Executors.newCachedThreadPool()...