Spring 源码分析(六)——Bug?getBean取出的Bean居然未经初始化

Spring 是线程安全的,支持多线程并发调用。但在某种特殊情况下,使用 BeanFactory 的 getBean 方法,我成功拿到了未经初始化的 Bean(是BUG,亦或是出于某种原因考虑的特性?)。

Java 锁系列(四)——ReentrantLock源码Condition实现分析

Condition 是个接口,依赖于 Lock 接口的实现,基本的方法就是 await() 和 signal() 方法,是在 java 1.5 中才出现的,用于替代 Object 的 wait()、notify() 实现线程间的协作,相比使用 Object 的 wait()、notify(),使用 Condition 的 await()、signal() 这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。

Java 并发系列(二)——Semaphore源码分析

Semaphore 通常叫它信号量, 可以用来控制同时访问特定资源的线程数量,也可以用来保持资源生产者和消费者之间的资源限制关系,通过协调各个线程,以保证合理的使用资源。Semaphore 具有公平和非公平两种模式,本文通过源码对 Semaphore 的实现做简单分析。

Java 并发系列(一)——CountDownLatch源码分析

CountDownLatch 构造一个用给定计数初始化的并发计数器,能够协调多个线程之间的同步,当前线程在计数器倒计数至零之前一直等待,除非线程被中断。一般用于流程控制之类的场景,大流程分成多个子流程,子流程全部结束后大流程开始操作。

Java 锁系列(七)——StampedLock源码分析

StampedLock 是读写锁的实现,对比 ReentrantReadWriteLock 主要不同是该锁不允许重入,多了乐观读的功能,使用上会更加复杂一些,且仅支持非公平锁,但是具有更好的性能表现。StampedLock 的状态由版本和模式组成。 获取锁方法返回一个邮戳,表示和控制与锁状态相关的访问; 这些方法的“尝试”邮戳可能会返回特殊值 0 来表示获取锁失败。 锁释放和转换方法需要标记作为参数,如果它们与锁的状态不匹配则失败。本文对 StampedLock 的实现源码进行分析。

Java 锁系列(六)——StampedLock使用

StampedLock 是读写锁的实现,对比 ReentrantReadWriteLock 主要不同是该锁不允许重入,多了乐观读的功能,使用上会更加复杂一些,但是具有更好的性能表现。StampedLock 的状态由版本和模式组成。 获取锁方法返回一个标记,表示和控制与锁状态相关的访问; 这些方法的“尝试”版本可能会返回特殊值 0 来表示获取锁失败。 锁释放和转换方法需要标记作为参数,如果它们与锁的状态不匹配则失败。本文描述 StampedLock 的基础使用场景,入门教程。

Java 锁系列(五)——ReentrantReadWriteLock源码分析

ReentrantReadWriteLock 是读写锁的实现,读锁可以在没有写锁的时候被多个线程同时持有,写锁就是和 ReentrantLock 类似的独占锁,它同样有包含公平锁和不公平锁两种实现方式,在实例化时将同时实例化 ReadLock 和 WriteLock 实例,本文主要聚焦于 WriteLock 的实现分析,因为 ReentrantReadWriteLock 中的部分实现与 ReentrantLock 一样基于 AbstractQueuedSynchronized 的实现,对于一些相同的逻辑本文不再赘述。

Java 锁系列(三)——ReentrantLock源码分析

ReentrantLock 是一个可重入的独占锁,是基于 AQS(AbstractQueuedSynchronized,抽象队列式同步器)实现的,它有公平锁和不公平锁两种实现方式。简单查看源码,可以发现 ReentrantLock 其实是一个代理的模式,Reentranlock 的核心是其内部继承自 AbstractQueuedSynchronized 的抽象类 Sync,将 Sync 作为锁的同步基础,其中加锁/解锁等操作其实都是由 Sync 对象完成的,也是通过实例化 FairSync 或 NonfairSync 分别对应公平锁和非公平锁的实现。

Java 锁系列(二)——ReentrantLock 和 ReentrantReadWriteLock基础运用

Lock 接口提供了与 synchronized 相似的功能,和 synchronized 不同的是,Lock 在使用的时候需要显示的获取和释放锁。虽然牺牲了隐式获取释放锁的便捷性,但是对于锁的操作具有更强的可操作性、可控制性以及提供可中断操作和超时获取锁等机制。本文将描述 ReentrantLock 和 ReadWriteLock 锁的基础使用。

Java 锁系列(一)——锁分类和基础概述

在多线程在获取资源的时候,锁用于保证资源获取的有序性和占用形,可以控制多个线程访问共享资源的顺序。Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对 java 主流的锁进行分类,梳理锁相关的基础知识。

java实现多线程的四种方式及多线程源码分析

本文使用到的东西eclipse 2019-11java1.继承Thread类1.1实现代码class MyThread extends Thread{private int num=0;public void run() {for(int i=0;i<6;i++) {System.out.pr

java多线程共享数据、线程同步与互斥

写在前面本文全文以售票系统为例,简诉了java多线程间共享数据的两种方式、线程同步。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。本文使用到的东西javaeclipse 2019-111.多线程共享数据1.1 共享Runnable 当多个线程执行的内容相同,可以采用共享Runnable接口实现