Jiefang's Blog

过去心不可得,现在心不可得, 未来心不可得

Java多线程-22丨JUC-CountDownLatch(倒计时门闩)

JUC-CountDownLatch 简介 CountDownLatch是一个同步辅助类,通过AQS实现的一个闭锁。在其他线程完成它们的操作之前,允许一个多个线程等待。简单来说,CountDownLatch中有一个锁计数,在计数到达0之前,线程会一直等待。 用法 1 2 3 4 5 6 7 8 9 10 11 //初始化 CountDownLatch coun...

Java多线程-21丨JUC-ReentrantReadWriteLock(读写锁)

JUC-ReentrantReadWriteLock(读写锁) 简介 ReentrantReadWriteLock维护了一对相关的锁:共享锁readLock和独占锁writeLock。共享锁readLock用于读操作,能同时被多个线程获取;独占锁writeLock用于写入操作,只能被一个线程持有。 读写锁的主要特性: 公平性: 非公平锁:默...

Java多线程-20丨JUC-AQS-Condition接口实现

JUC-AQS-Condition接口实现 Condition简介 Condition是关联在Lock上的条件,提供对线程更加灵活和详细的唤醒和等待操作。 Condition与Object.wait和Object.notify的比较: 对比项 Object监视器方法 Condition 前置条...

Java多线程-19丨JUC-ReentrantLock(可重入锁)

ReentrantLock 简介 官方定义 可重入的互斥锁,其基本行为和语义与使用synchronized方法和语句访问的隐式监视器锁相同,但具有扩展的功能。 可重入的意思是可以被线程多次获取锁。ReentrantLock又分为公平锁(fair lock)和非公平锁(non-fair lock)。它们的区别体现在获取锁的机制上:在“公平锁”的机制下,线程依次排队获取锁;而“非公平锁”机...

Java基础-02丨Java中的SPI机制

Java中的SPI机制 概念 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 整体机制图: Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思...

Java多线程-18丨JUC-AQS(同步器)源码分析-共享锁的获取和释放

JUC-AQS(同步器)源码分析-共享锁的获取和释放 共享锁与独占锁的区别 共享锁与独占锁最大的区别在于,独占锁是独占的,排他的,因此在独占锁中有一个exclusiveOwnerThread属性,用来记录当前持有锁的线程。当独占锁已经被某个线程持有时,其他线程只能等待它被释放后,才能去争锁,并且同一时刻只有一个线程能争锁成功。 对于共享锁而言,由于锁是可以被共享的,它可以被多个线程同时持有...

Java多线程-17丨JUC-AQS(同步器)源码分析-独占锁的释放

JUC-AQS(同步器)源码分析-独占锁的释放 JAVA的内置锁在退出临界区之后是会自动释放锁的, 但是ReentrantLock这样的显式锁是需要自己显式的释放 1 2 3 4 5 6 7 8 Lock lock = new ReentrantLock(); ... lock.lock(); try { ... } finally { lock.unlock(); } ...

Java多线程-16丨JUC-AQS(同步器)源码分析-独占锁的获取

JUC-AQS源码分析-独占锁的获取 acquire(int arg) 独占模式下获取资源/锁,忽略中断的影响。 1 2 3 4 5 6 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCL...

Zookeeper-03丨ZAB 协议

ZAB 协议 事务编号 Zxid(事务请求计数器+ epoch) 在 ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议) 协议的事务编号 Zxid 设计中,Zxid 是一个 64 位的数字,其中低 32 位是一个简单的单调递增的计数器,针对客户端每一个事务请求,计数器加 1;而高 32 位则代表 Leader 周期 epoch 的编号...

Zookeeper-02丨Zookeeper基础进阶

Zookeeper基础进阶 watcher机制 Zk中引入了watcher机制来实现了发布/订阅功能,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者ͺ Watcher组成 客户端 客户端watchManager Zk服务器 Watcher机制 客户端向zk服务器注册watcher的同时,会将watcher对象存储在客户端的wa...

Zookeeper-01丨Zookeeper基础

Zookeeper基础 Zookeeper是一个高性能,分布式的,开源分布式应用协调服务。它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,配置管理,集群管理,命名空间。它被设计为易于编程,使用文件系统目录树作数据模型。 数据模型 分层结构 树形结构中的每个节点叫做Znode 每个Znode都有数据(byte[]类型),也可以有子节点 节点路径 ...

Java多线程-15丨LockSupport(阻塞原语)

LockSupport LockSupport是用来创建锁和其他同步类的基本线程阻塞原语 使用 每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在进程中使用,则调用park()将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark()使其可用。但是注意许可不可重入,也就是说只能调用一次park()方法,否则会一直阻塞。 ...

Java多线程-14丨JUC-AQS(同步器)简介

JUC-AQS(同步器)简介 JUC三板斧 了解以下JUC的设计套路,总结三板斧: 状态,队列,CAS 状态:一般是一个state属性,它基本是整个工具的核心,通常整个工具都是在设置和修改状态,很多方法的操作都依赖于当前状态是什么。由于状态是全局共享的,一般会被设置成volatile类型,以保证其修改的可见性; 队列:队列通常是一个等待的集合,大多数以链表的形式实现。队列...

Java多线程-13丨ThreadPoolExecutor(线程池)

线程池 概述 ThreadPoolExecutor 是线程池的核心实现。线程的创建和终止需要很大的开销,线程池中预先提供了指定数量的可重用线程,所以使用线程池会节省系统资源,并且每个线程池都维护了一些基础的数据统计,方便线程的管理和监控。 参数 1 2 3 4 5 6 7 public ThreadPoolExecutor(int corePoolSize, ...

Java多线程-12丨JUC-任务执行框架

JUC-任务执行框架 职责模型: 任务类型:Runnable无返回结果、Callable有返回结果 任务与线程执行分离:Executor 执行线程管理与任务管理:ExecutorService 任务管理功能:Future 基于线程池的线程执行管理:ThreadPoolExecutor 接口/类 职责 ...

Java多线程-11丨JUC框架

JUC框架 Condition   Condition为接口类型,它将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方...

Java多线程-10丨Unsafe

Unsafe 前言 Unsafe是实现CAS的核心类,Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。Unsafe类提供了硬件级别的原子操作。 特点 私有的构造函数 工厂方法getUnsafe()的调用器只能被Boot classloader加载,否则抛出SecurityException 异常 1 2 3 4 5 6 7 8 9 10 ...

Java多线程-09丨CAS

CAS CAS(Compare and Swap),即比较并替换。 CAS的思想很简单:三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。 示例 AtomicInteger示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public...

Java多线程-08丨ThreadLocal原理

ThreadLocal原理 什么是ThreadLocal ThreadLocal注释: This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@...

Java多线程-07丨线程中断机制

线程中断机制 Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理。 主要涉及内容: interrupt flag:中断标志位; InterruptedException:中断异常; interrupt():设置线程中断标志; interrupted():返回线...