Java—并发编程(七)JUC集合 – (8) LinkedBlockingQueue
LinkedBlockingQueue介绍 LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位…
Java—并发编程(七)JUC集合 – (7) ArrayBlockingQueue
ArrayBlockingQueue介绍 ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。 线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,…
Java—并发编程(七)JUC集合 – (6) ConcurrentSkipListSet
ConcurrentSkipListSet介绍 ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。ConcurrentSkipListSet和TreeSet,它们虽…
Java—并发编程(七)JUC集合 – (5) ConcurrentSkipListMap
ConcurrentSkipListMap介绍 ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景。ConcurrentSkipListMap和TreeMap,它们…
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…