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...
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...
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...
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关系是一种线程之间安全传输数据的方式,某一线程首先独自向内存写入数据,待写入完成后,发布一个操作...
Java对象的发布
基本概念
对象的发布是指,使一个对象能够在当前作用域之外的代码中使用(直接访问到对象的引用)
对象的逸出是指,一个不应该发布的对象被发布
对象不正确构造
如果this引用在构造过程中逸出,那么这种对象就被认为是不正确构造。我们应该确保对象的构造过程中不会出现this引用逸出
构造过程this引用逸出的例子
public class ThisEscape {
public ThisEscape(EventSource source) {
// 构造方法中,调用了一个外部方法,发布了eventListener对象
// eventListener对象是一个匿名内部类的对象,因此同时也发布了包装类ThisEscape的this对象...
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...
单元测试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...
HTTPS工作原理
数据加密传输
HTTP
HTTP不对传输的报文进行加密,信息有被窃取的风险
加入对称加密
客户端和服务器先选用一致的对称加密的算法和密钥,后续的传输数据该算法和密钥进行加密。由于密钥的传输过程并没有加密,密钥有被窃取的风险
加入非对称加密
为了降低上一步对称加密密钥被窃取的风险,在密钥的传输过程使用非对称加密。由于服务器的公钥传输给客户端后,客户端无法对公钥的真实性进行验证,有发生中间人攻击的风险,黑客发送自己的公钥给客户端,取代服务器与客户端进行通信
加入数字证书
为了使得上一步客户端可以验证公钥的真实性,服务器不直接传输公钥到客户端,而是改为传输数字证书。数字证书由证书颁发机构(CA)颁发,数字证书中除了包含之前要传输的公钥外,还有经过上级证书私钥签名的...
Lock-Free编程
Lock-Free定义
In an infinite execution, infinitely often some method call finishes.
在无穷的执行时间里,不断地有方法调用被完成
Lock-Free特征
不使用互斥锁
需要原子操作的保证
多线程不互斥地访问共享内存
没有任何线程调度序列会让程序整体锁死
Lock-Free相关技术
在Lock-Free编程中,当需要讨论多线程如何并发访问共享内存时,大体可以可以分为两个方向:单个写线程和多个写线程。
单个写线程的场景下通常使用传信号的合作方式,例如Acquire and Release语义,即写线程的写操作完成后,发布一个操作完成的信号,各个读线程接收到该信号后...
原子操作(Atomic Operations)
概述
原子操作是多线程操作共享内存的情况下产生的概念,当一个操作是原子操作时,这个操作对其它线程来说是不可分割的
使用场景
任何时候,任意两个线程并发操作共享内存,只要其中一个线程包含对内存的写入操作,则这两个线程都必须使用原子操作,否则程序的执行会出现非预期结果
换句话说,假如保证在操作共享内存时,总是单线程在操作,则原子操作不是必须的
原子读写(Atomic Loads and Stores)
原子读意味着,对共享内存进行读操作,表现得像是一瞬间读取出完整的值。非原子读可能导致torn reads,例如线程A先读取了一个64位变量的低32位,接着线程B完整地修改了这个变量的值,线程A最后再读取变量的高32位。最终结果是线程A读取到的变量值是修改前的低32位拼合修改后的高...
332 post articles, 34 pages.