5.2k 5 分钟

# 条件变量 线程有时需要检查某一条件(condition)满足后才能继续运行:子线程 join 父线程。这也就意味着父线程需要等待子线程运行完才能继续运行。 设计一个共享变量:这样父线程就需要一直自旋来等待子线程运行结束,将共享变量改为父线程可用状态。这种设计缺点就是浪费时间,某些情况甚至是错误的。 加入等待队列:其实整个设计思想和 A 篇中我们讲到设计锁的思想很相似,这里的条件变量就是” 锁...
6k 5 分钟

# 并发:介绍 经典观点:一个程序只有一个执行点(一个程序计数器,存放执行的指令),那么所有的执行都是顺序执行的。但是多线程(multi-threaded)程序有多个执行点,此处区别进程,多线程程序中,线程之间共享地址空间,能够访问到相同的数据。 类比进程,当两个线程运行在一个处理器上,从运行 A 线程到运行 B 线程,一定会发生上下文切换(context switch),进程的状态保存到 PCB 中,线程的状态保存到 TCB(Thread Control...
746 1 分钟

# 前言 现在你看到的并发标签是我第二次重制版,第一次的并发系列文章比较散乱,当时也是处于初学阶段,心态不够沉稳,很多东西看不清晰就写了博客,所以这次打算好好改一下。 个人观点:Java 并发需要分为两个部分学习,一部分为操作系统级别的并发知识,另一部分才是 j.u.c 包。考虑到整个体系的知识量过于庞大,所以本系列前几篇长篇文章,都会用于简述第一部分的内容,概述操作系统的并发和 Java 为了并发而做出的努力,如内存模型,类设计,并发关键字等。然后剩下的文章才是对 j.u.c 包中各个类的应用解释,该部分我们会阅读大量源码,有些类我们会着重讲解,像 AQS...
12k 11 分钟

# SPI 机制详解 SPI(Service Provider Interface),是 JDK 内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。 必看视频:10 分钟让你彻底明白 Java SPI,附实例代码演示 #安员外很有码 这个教学视频讲的详略得当,还有代码实战。 从 SPI 机制就可以看出,接口的存在是多么的重要,比如 java.sql.Driver 接口,其他不同厂商可以针对同一接口做出不同的实现,而我们只需要调用接口即可,根本不关心实现是怎么样的,SPI 机制主要思想就是将装配的控制权转移到程序之外。整个学习过程你需要牢记一个词 ——...
2.7k 2 分钟

本章讲解 redis 配置主从复制和哨兵模式 # 主从复制 主从赋值是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点 (Master),后者称为从节点 (Slave),数据的复制是单向的,只能由主节点到从节点。Master 以写为主,Slave 以读为主。 优点: 读写分离,提高性能。 主要是读多写少的场景下,可以为一个主节点安排很多个从节点,这样就能分担压力,即使挂掉一个,其他的也可以使用。 首先要启动两个 Redis 服务器,修改以下配置文件,注意这两个配置文件的端口不能一样(因为是放在一个虚拟机上跑的),我这里是 port1 = 6890...
2.7k 2 分钟

# 字符串哈希 例子为 LeetCode 187. 重复的 DNA 序列 DNA 序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。 例如,"ACGAATTCCG" 是一个 DNA 序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。 给定一个表示 DNA 序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列 (子字符串)。你可以按 任意顺序 返回答案。 常规解法 本题限制时间的操作就是拿到一个长度为 10...
5.8k 5 分钟

# 异常机制 先看类结构,再学使用,不然讲使用的时候会有点懵。 # 异常层次结构 Java 异常都是对象,是 Throwable 子类的实例。Java 通过 Throwable 众多子类描述各种不同的异常,描述出现在一段编码中的错误条件,当条件生成时,错误就会引发异常。 错误比异常更严重,当出现时,JVM 直接就崩了,本文主要讲的还是异常。 Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。 对于异常,分为两种: 运行时异常 都是 RuntimeException 类及其子类,比如...
8.1k 7 分钟

# 注解机制 在之后的开发中,注解是一定离不开的,所以前期的学习就要打好基础。注解的出现极大便利了开发过程,很多需要很麻烦的配置,代码之类的,都通过注解得以简化。其作用表现如下: 生成文档,通过代码里标识的元数据生成 javadoc 文档。 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。 # 内置注解 JDK 内置了以下注解: @Override -...
5.8k 5 分钟

# 反射基础 RTTI(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是 “传统的” RTTI,它假定我们在编译时已经知道了所有的类型;另一种是 “反射” 机制,它允许我们在运行时发现和使用类的信息。 反射就是把 java 类中的各种成分映射成一个个的 Java 对象(比如 Method 对象, Field 对象)。 Q:反射如何允许我们在运行时使用类信息?这些类信息哪来的? # Class 类 Class 类的实例表示 java...
4.7k 4 分钟

# 泛型机制 重视基础,基础不牢,地动山摇。 泛型出现前,想要在一个类中存储的数据可以是不同的类,就只有写成 Object,比如集合 List,就只能是 Object[] ,而不是 T[] 。这样写会出现的问题是,使用 List 的人需要在取出数据时强制转换。 String s = (String)list.get(0);但是 Object 在编译阶段并不具备良好的类型判断能力,也就是说: List list = new ArrayList(); // 假设现在还没有泛型list.add(123);String s = (String)list.get(0); //...