Java—并发编程(六)JUC锁 – (10) Semaphore
Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁"。 信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线…
Java—并发编程(六)JUC锁 – (9) CyclicBarrier
CyclicBarrier简介 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等…
Java—并发编程(六)JUC锁 – (8) CountDownLatch
我们对CountDownLatch进行学习。和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁"。 CountDownLatch简介 CountDo…
Java—并发编程(六)JUC锁 – (7)共享锁和ReentrantReadWriteLock
Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁",对Java的独占锁进行了说明。这里对Java的“共享锁”进行介绍,JUC中的共享锁有CountDownL…
Java—并发编程(六)JUC锁 – (6)LockSupport
LockSupport LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且par…
Java—并发编程(六)JUC锁 – (5)Condition条件
Condition Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法 Condition中的signal()方法相当于Obj…
Java—并发编程(六)JUC锁 – (4)非公平锁
非公平锁 非公平锁和公平锁在获取锁的方法上,流程是一样的; 它们的区别主要表现在“尝试获取锁的机制不同”。 简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待);而“非…
Java—并发编程(六)JUC锁 – (3)公平锁
我们会讲解“线程获取公平锁”的原理;在讲解之前,需要了解几个基本概念。后面的内容,都是基于这些概念的;这些概念可能比较枯燥,但从这些概念中,能窥见“java锁”的一些架构,这对我们了解锁是有帮助的。1…
Java—并发编程—自旋锁、排队自旋锁、MCS锁、CLH锁
自旋锁(SPIN LOCK) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。 自旋锁适用于锁保护的临界区很小的情况,临界区很…
Java—并发编程—重入锁
ReentrantLock重入锁 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”。 ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedS…
Java—并发编程—AQS(三)
第一篇,我们通过 ReentrantLock 公平锁分析了 AQS 的核心,第二篇的重点是把 Condition 说明白,同时也说清楚了对于线程中断的使用。 这篇,我们的关注点是 AQS 最后的部分,…
Java—并发编程—AQS(二)
本文关注以下几点内容: 深入理解 ReentrantLock 公平锁和非公平锁的区别深入分析 AbstractQueuedSynchronizer 中的 ConditionObject深入理解 Jav…
Java—并发编程—AQS
在分析 Java 并发包 java.util.concurrent 源码的时候,少不了需要了解 AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是 Java 并…
SpringSecurity—区分登录失败异常
当我们登录失败的时候,可能用户名写错,也可能密码写错,但是出于安全考虑,服务端一般不会明确提示是用户名写错了还是密码写错了,而只会给出一个模糊的用户名或者密码写错了。 然而对于很多程序员而言,可能并不…
SpringSecurity—两种方式 DIY 登录
一般情况下,我们在使用 Spring Security 的时候,用的是 Spring Security 自带的登录方案,配置一下登录接口,配置一下登录参数,再配置一下登录回调就能用了,这种用法可以算是…
Java—并发编程(六)JUC锁 – (2) ReentrantLock
ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,Ree…
Java—并发编程(六)JUC锁 – (1)总览
根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁"。 同步锁 即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就…
Java—并发编程(五)AtomicXXX(原子类)
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类。 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型…
Java—并发编程(四)volatile关键字
一、内存模型 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU…
Java—并发编程(三)线程等待\唤醒\让步\休眠\join\守护……
线程等待与唤醒 1. wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口。 wait…
Java—并发编程(二)synchronized关键字
1. synchronized原理 在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,s…
Java—并发编程(一)线程基础
多线程是Java中不可避免的一个重要主体。接下来的内容,是对“JDK中新增JUC包”之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), notify()等接口;Thre…
Java—Cglib基本使用
Cglib是什么 Cglib是一个强大的、高性能的代码生成包,它广泛被许多AOP框架使用,为他们提供方法的拦截。 对此图总结一下: 最底层的是字节码Bytecode,字节码是Java为了保证“一次编译…
Java—Cglib的invoke和invokeSuper区别
简而言之,invoke方法调用的对象没有增强过,invokeSuper方法调用的对象已经是增强了的,所以会再走一遍 MyMethodInterceptor的 interceptor方法,如果是个拦截器…
Java—Javassist(动态代理)(动态字节)
概述 Javassist是一个开源的分析、编辑和创建Java字节码的类库,可以直接编辑和生成Java生成的字节码。相对于bcel, asm等这些工具,开发者不需要了解虚拟机指令,就能动态改变类的结构,…
Kotlin—日志的使用方法
都知道java中的@Slf4j使用得多么的舒服: @Slf4j public class TestController{ @GetMapping("/test") public String test…
SpringSecurity—权限管理的投票器与表决机制
当用户想访问 Spring Security 中一个受保护的资源时,用户具备一些角色,该资源的访问也需要一些角色,在比对用户具备的角色和资源需要的角色时,就会用到投票器和表决机制。 当用户想要访问某一…
SpringSecurity—从子线程获取用户登录信息
Spring Security 中想要获取登录用户信息,不能在子线程中获取,只能在当前线程中获取,其中一个重要的原因就是 SecurityContextHolder 默认将用户信息保存在 Thread…
SpringSecurity—new 出来的对象一样也可以被 Spring 容器管理
按理说自己 new 出来的对象和容器是没有关系的,但是在 Spring Security 框架中也 new 了很多对象出来,一样也可以被容器管理,那么它是怎么做到的? 有些项目,就会发现里边的动态权限…
SpringSecurity—多种加密方案共存
1.PasswordEncoder 在 Spring Security 中,跟密码加密/校验相关的事情,都是由 PasswordEncoder 来主导的,PasswordEncoder 拥有众多的实现…