Home

Acquire and Release语义

概述 Acquire and Release语义表示多线程并发访问共享内存的一种方式,表现为线程间的一种合作关系,在单个写线程的场景下使用。写线程的写操作完成后,发布一个操作完成的信号,各个读线程接收到该信号后,对值进行读取,实现线程间信息的可靠传输 语义定义 一个对共享内存的读操作(也可以是read-modify-write操作)可以具有acquire语义,具有acquire语义的读操作被称为read-acquire。Acquire语义消除了read-acquire与后续的读取与写入操作的内存重排序 一个对共享内存的写操作(也可以是read-modify-write操作)可以具有release语义,具有release语义的写操作被称为write-release。Relea...

Read more

Spring Security同时支持用户名密码登录和OAuth登录

前置 先基于Spring Boot实现OAuth登录 Spring Security OAuth第三方登录实例 Spring Security配置 认证配置 配置两个SecurityFilterChain的bean,分别负责OAuth登录和FormLogin的认证设置。两个SecurityFilterChain的优先级通过@Order指定,优先级较高且符合匹配规则的负责处理此次请求。此处oauthFilterChain优先级较高,不以/formLogin开头的请求符合匹配规则,都由oauthFilterChain负责处理。以/formLogin开头的请求则落到formFilterChain处理。 SecurityConfiguration.java @Bean...

Read more

内存屏障(Memory Barriers)

概述 内存屏障用于解决运行时产生的内存重排序(又称处理器重排序),通常通过加入CPU屏障指令(fence instructions)来实现加入内存屏障 分类 为了便于理解,此处我们将高速缓存看作是内存的延申,先把高速缓存与内存看成是一个整体,并以内存一词并称 LoadLoad屏障,重点在于屏障后的内存读取操作,位于屏障后的任意内存读取操作必须晚于屏障前的任意内存读取操作,不保证屏障后的内存读取操作读取到当前内存的最新值,但保证与屏障前的任意内存读取操作相比,能读取到同等新或更新的数据 StoreStore屏障,重点在于屏障前的内存写入操作,位于屏障前的任意内存写入操作必须早于屏障后的任意内存写入操作,不保证屏障前的内存写入操作什么时候完成,但保证比屏障后的任意内存写入...

Read more

内存重排序(Memory Reordering)

概念 内存重排序(Memory Reordering)是指,程序执行时与内存交互的顺序与程序源码中的编写顺序不一致 为了便于理解,此处我们将高速缓存看作是内存的延申,先把高速缓存与内存看成是一个整体,并以内存一词并称 例如,在某一程序源码中,有两个写操作A和B,且代码的编写顺序是先执行写操作A,后执行写操作B。但程序实际执行时,与内存的交互却是操作B先于操作A。也就是说,对于其它观测者(另一线程、或另一CPU内核)而言,写操作B先于写操作A 又如,在某一程序源码中,有两个读操作A和B,且代码的编写顺序是先执行读操作A,后执行读操作B。按此执行顺序,读操作B应该从内存中读取到与读操作A同样新或更新的数据,但程序实际执行结果可能相反,读操作A从内存中读取到更新的数据。这样的结果看起...

Read more

Java Unsafe类主要功能

简介 通过Java中的Unsafe类可以执行很多较底层的操作,如直接分配堆外内存等,因此使用起来具有一定的风险,Unsafe类的名称由此得来。Unsafe类通常只提供给由BootstrapClassLoader类加载器所加载的类使用,且在JDK源码中有较广泛的使用 JDK9及以后,除了原来的sun.misc.Unsafe类之外,还多出了一个jdk.internal.misc.Unsafe类,新多出来的这个Unsafe类仅供JDK內部使用,并且功能比原来的Unsafe类更加强大。原来的Unsafe类的某些方法的实现也改为了依赖新的Unsafe类 使用Unsafe 一般不建议在应用代码中直接使用Unsafe,若要使用,可通过反射取得Unsafe对象,又或者把使用Unsafe的应用类...

Read more

CPU高速缓存模型

下文讨论的模型与协议将尽量简化,不考虑实际上存在的很多复杂情况与细节 模型演变 单核时代 一个简易模型如下 内存对于CPU来说速度很慢,因此加入高速缓存(cache,下文简称缓存)来避免CPU资源的浪费。在单核时代,即时在多线程环境,不同的线程仍然由同一个CPU执行,使用的是同一个缓存,不存在缓存数据不一致的问题 为了提升缓存的命中率,依据局部性原理,CPU将数据加入缓存时,会将即将使用到的数据连带相邻的一部分数据一起加入,一次加入缓存的数据称为一行缓存行 多核时代 进入多核时代,由于每个CPU内核都会有自己的一块缓存区域,因此出现了基于MESI缓存一致性协议的解决方案,用于协调各个CPU的缓存状态,解决缓存数据不一致的问题 简易的多核模型如下,不同的CPU的缓存通...

Read more

Remember-Me工作原理

工作流程 首次登录 在首次登录时,客户端发送的数据中提示开启remember-me功能。服务器接收到登录请求数据后,按正常流程先根据用户名和密码验证用户的有效性,验证通过后,生成remember-me token。remember-me token中包含用户名,token有效期和用于验证token有效性的摘要信息。最后服务器在对客户端的响应中添加这个remember-me token session失效后使用remember-me token登录 session失效后,客户端请求服务器资源时仍然会通过cookie带上未过期的remember-me token。服务器接收到这个token后,先验证token的合法性,包括其是否在有效期内,以及重新计算摘要信息以比对toke...

Read more

阿里云ossutil同步文件夹

安装unzip yum install unzip 安装ossutil curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 配置ossutil 默认产生配置文件/root/.ossutilconfig,或者非root用户/home/user/.ossutilconfig ossutil config 根据提示输入endpoint, accessKey ID, accessKey Secret即可 阿里云配置RAM子账户访问OSS 同步文件夹 从本地文件夹同步到OSS,--delete选项指定删除目的端存在而源端不存在的文件,仅保留本次同步的文件,-f选项指定覆盖已存在文件时...

Read more

阿里云OSS使用

Maven依赖 <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> 文件上传 OSS ossClient = new OSSClientBuilder().build(endpoint, assessKey, secretKey); // 将fileUrl指向的文件上传到OSS URLConnection urlConnection = new ...

Read more

阿里云配置RAM子账户访问OSS

配置权限策略 定义只能访问特定bucket的RAM子账户,如果需要的是可以访问账号所有bucket的RAM子账户,则跳过此步骤直接使用系统权限策略AliyunOSSFullAccess即可 登录阿里云,点击右上角控制台按钮,访问阿里云控制台 右上角用户菜单,点击访问控制 创建权限策略 脚本编辑 { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:*:*:oliver-blog", "acs:oss:*:*:oliver-blog/*" ...

Read more