Java—并发编程(七)JUC集合 – (4) ConcurrentHashMap
ConcurrentHashMap介绍 ConcurrentHashMap是线程安全的哈希表。HashMap, Hashtable, ConcurrentHashMap之间的关联如下: Ha…
Java—并发编程(七)JUC集合 – (3) CopyOnWriteArraySet
CopyOnWriteArraySet介绍 它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类A…
Java—并发编程(七)JUC集合 – (2) CopyOnWriteArrayList
CopyOnWriteArrayList介绍 它相当于线程安全的ArrayList。和ArrayList一样,它是个可变数组;但是和ArrayList不同的时,它具有以下特性: 1. 它最适合于具有以…
Java—并发编程(七)JUC集合 – 概览
Java集合包 在之前中,介绍java集合的架构。主体内容包括Collection集合和Map类;而Collection集合又可以划分为List(队列)和Set(集合)。 1. List的实现类主要有…
Java—并发编程(六)JUC锁 – (12) Phaser
java多线程技术提供了Phaser工具类,Phaser表示“阶段器”,用来解决控制多个线程分阶段共同完成任务的情景问题。其作用相比CountDownLatch和CyclicBarrier更加灵活。 …
Java—并发编程(六)JUC锁 – (11) Exchanger
Exchanger的使用 Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据。 当一个线程调用exchange方法后将进入等待状态,直到另外…
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方法,如果是个拦截器…