Home

Spring Security工作原理

基本架构 从servlet的角度去分析,Spring Security实质上是一个filter,具体是通过DelegatingFilterProxy这个类实现的。DelegatingFilterProxy中默认会将Spring Security需要做的工作代理给FilterChainProxy这个bean,而FilterChainProxy又会将工作代理给第一个符合条件的SecurityFilterChain类型的bean 一个SecurityFilterChain的bean中可以绑定多个filter,可以绑定自定义的filter,也可以通过配置绑定Spring Security预定义的filter。 例如,当没有对Spring Security作任何的配置时,默认的一个Se...

Read more

Java任务执行框架源码分析

本文源码基于JDK11 任务 无返回值的任务,由Runnable接口来描述,通过实现run方法来指定任务逻辑 package java.lang; @FunctionalInterface public interface Runnable { public abstract void run(); } 有返回值的任务,由Callable接口来描述,通过实现call方法来指定任务逻辑 package java.util.concurrent; @FunctionalInterface public interface Callable<V> { V call() throws Exception; } Executor...

Read more

JCStress使用

构建Maven项目 构建项目时,使用阿里云Maven镜像可能导致一些错误,例如无法找到对应的模板和依赖,建议直接使用Maven中央仓库 mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jcstress -DarchetypeArtifactId=jcstress-java-test-archetype -DgroupId=com.oliverclio -DartifactId=jcstress -Dversion=1.0 编写测试类 Continuous模式 package com.oliverclio; import org.openjdk.jcstres...

Read more

Happens-Before关系

定义 假设有操作A和操作B,且有A happens-before B的关系,则表明操作A对内存产生的效果在操作B被执行前,对操作B等效可见 以下两个条件满足任意一个即可视为等效可见 操作A对内存产生的效果确实对操作B可见 操作A对内存产生的效果不对操作B产生任何影响 确立关系 确立happens-before关系的概览图如下,图中只列出一些常见的确立关系方式 Program Order 同一线程执行操作A和操作B,若代码顺序操作A在操作B前面,则有A happens-before B的关系 Synchronizes-with Synchronizes-with关系是一种线程之间安全传输数据的方式,某一线程首先独自向内存写入数据,待写入完成后,发布一个操作...

Read more

Java对象的发布

基本概念 对象的发布是指,使一个对象能够在当前作用域之外的代码中使用(直接访问到对象的引用) 对象的逸出是指,一个不应该发布的对象被发布 对象不正确构造 如果this引用在构造过程中逸出,那么这种对象就被认为是不正确构造。我们应该确保对象的构造过程中不会出现this引用逸出 构造过程this引用逸出的例子 public class ThisEscape { public ThisEscape(EventSource source) { // 构造方法中,调用了一个外部方法,发布了eventListener对象 // eventListener对象是一个匿名内部类的对象,因此同时也发布了包装类ThisEscape的this对象...

Read more

Java容器ConcurrentHashMap源码分析

本文源码基于JDK8 优化算法 以下在HashMap中使用的优化算法在ConcurrentHashMap中也同样使用了,详情请查看 哈希求模优化 扩容哈希求模优化 哈希扰动 其中哈希扰动算法在HashMap的基础上再进行了一点优化,加入了哈希掩码 static final int HASH_BITS = 0x7fffffff; 将原来的哈希值与哈希掩码按位与,相当于将原来的哈希值的最高位置0,可进一步降低哈希冲突的可能性 static final int spread(int h) { return (h ^ (h >>> 16)) & HASH_BITS; } 数据结构 ConcurrentHashMap...

Read more

单元测试Test double详解

Test double In computer programming and computer science, programmers employ a technique called automated unit testing to reduce the likelihood of bugs occurring in the software. Frequently, the final release software consists of a complex set of objects or procedures interacting together to create the final result. In automated unit testing...

Read more

HTTPS工作原理

数据加密传输 HTTP HTTP不对传输的报文进行加密,信息有被窃取的风险 加入对称加密 客户端和服务器先选用一致的对称加密的算法和密钥,后续的传输数据该算法和密钥进行加密。由于密钥的传输过程并没有加密,密钥有被窃取的风险 加入非对称加密 为了降低上一步对称加密密钥被窃取的风险,在密钥的传输过程使用非对称加密。由于服务器的公钥传输给客户端后,客户端无法对公钥的真实性进行验证,有发生中间人攻击的风险,黑客发送自己的公钥给客户端,取代服务器与客户端进行通信 加入数字证书 为了使得上一步客户端可以验证公钥的真实性,服务器不直接传输公钥到客户端,而是改为传输数字证书。数字证书由证书颁发机构(CA)颁发,数字证书中除了包含之前要传输的公钥外,还有经过上级证书私钥签名的...

Read more

Lock-Free编程

Lock-Free定义 In an infinite execution, infinitely often some method call finishes. 在无穷的执行时间里,不断地有方法调用被完成 Lock-Free特征 不使用互斥锁 需要原子操作的保证 多线程不互斥地访问共享内存 没有任何线程调度序列会让程序整体锁死 Lock-Free相关技术 在Lock-Free编程中,当需要讨论多线程如何并发访问共享内存时,大体可以可以分为两个方向:单个写线程和多个写线程。 单个写线程的场景下通常使用传信号的合作方式,例如Acquire and Release语义,即写线程的写操作完成后,发布一个操作完成的信号,各个读线程接收到该信号后...

Read more

原子操作(Atomic Operations)

概述 原子操作是多线程操作共享内存的情况下产生的概念,当一个操作是原子操作时,这个操作对其它线程来说是不可分割的 使用场景 任何时候,任意两个线程并发操作共享内存,只要其中一个线程包含对内存的写入操作,则这两个线程都必须使用原子操作,否则程序的执行会出现非预期结果 换句话说,假如保证在操作共享内存时,总是单线程在操作,则原子操作不是必须的 原子读写(Atomic Loads and Stores) 原子读意味着,对共享内存进行读操作,表现得像是一瞬间读取出完整的值。非原子读可能导致torn reads,例如线程A先读取了一个64位变量的低32位,接着线程B完整地修改了这个变量的值,线程A最后再读取变量的高32位。最终结果是线程A读取到的变量值是修改前的低32位拼合修改后的高...

Read more