Java并发编程
文章平均质量分 95
橡 皮 人
代码传递思想,技术创造回响。
展开
-
Redis第15讲——RedLock、Zookeeper及数据库实现分布式锁
由于篇幅原因,在上篇文章我们只介绍了redis实现分布式锁的两种方式——setnx和Redission,并对Reidssion加锁和看门狗机制的源码进行了分析,但这两种方案在极端情况下都会出现或多或少的问题。那么针对上述问题,比较主流的解决方案有两种:RedLock和Zookeeper实现的分布式锁。原创 2024-05-02 07:30:00 · 1898 阅读 · 0 评论 -
Redis第14讲——Redis实现分布式锁(Redission源码解析)
在多线程环境下,为了保证数据的线程安全,我们通常用加锁的方式,使同一时刻只有一个线程可以对这个共享资源进行操作,在单服务系统我们常用JVM锁——Synchronized、ReentrantLock等。然而在多台服务系统的情况下,JVM锁就无法在多个服务器之间生效了,这时候我们就需要用分布式锁来解决线程安全的问题。分布式锁的实现方式有很多,主流的就是基于数据库、zookeeper以及redis,当然使用redis的居多,由于篇幅原因,本节就详细介绍一下使用redis实现分布式锁的几种方式。原创 2024-04-25 07:30:00 · 859 阅读 · 0 评论 -
Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结
上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析,但是还不够,一是感觉有点零零散散,二是里面还有很多细节没介绍到——比如cancelAcquire()方法(重点),迫于篇幅原因,今天就把它放到这篇文章里,继续深入AQS!原创 2023-11-22 07:30:00 · 418 阅读 · 1 评论 -
Java并发编程第11讲——AQS设计思想及核心源码分析
AQS全称AbstractQueuedSynchronizer。JDK 1.5之前只有synchronized同步锁,并且效率并不高,因此并发大神Doug Lea在JDK 1.5的时候自己写了一套框架,希望能够成为高效率地实现大部分同步需求的基础,也就是我们现在熟知的AQS(队列同步器)。AQS提供了一个同步器的框架,JUC包下大多数同步器都是围绕着AQS 使用的一组共同的基础行为(如等待队列、条件队列、独占或共享获取等)实现的,比如前边提到的ReentrantLock、CountDownLatch、S原创 2023-11-08 07:15:00 · 466 阅读 · 0 评论 -
Java并发编程第10讲——CAS相关知识点详解
前面介绍锁的时候顺便也提到了CAS,但作为JUC的“基石”和面试中的高频考点,还是不够。所以,本篇文章将从CAS的概念入手,逐步深入介绍12个Atomic原子操作类、CAS的实现原理(源码解析)、Unsafe类、CAS存在的问题以及LongAddr。原创 2023-10-24 17:02:28 · 274 阅读 · 0 评论 -
Java并发编程第9讲——CountDownLatch、CyclicBarrier和Semaphore(万字详解)
在JDK的并发包(JUC)里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Samaphore工具类提供了一种并发流程控制的手段,这同样也是面试和工作中的一个重要知识点,本文将从它们的定义、常用方法、代码示例及核心源码的分析等几个要点详细介绍一下。原创 2023-10-13 08:00:00 · 757 阅读 · 0 评论 -
Java并发编程第8讲——ThreadLocal详解
ThreadLocal无论是在项目开发还是面试中都会经常碰到,它的重要性可见一斑,本篇文章就从ThreadLocal的使用、实现原理、核心方法的源码、内存泄漏问题等展开介绍一下。原创 2023-09-21 07:30:00 · 499 阅读 · 2 评论 -
Java并发编程第7讲——CompletableFuture、Future和ForkJoinPool(万字详解)
CompletableFuture是Java 8中引入的一个类,用于异步编程和并发操作,它大约提供了50个不同的方法,用于组合、合并和执行异步计算步骤以及处理错误。CompletableFuture类实现了Future和CompletionStage接口,这两个接口分别代表了异步任务的结果和完成状态,以及异步任务之间的依赖关系。原创 2023-09-07 07:15:00 · 680 阅读 · 0 评论 -
Java并发编程第6讲——线程池(万字详解)
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池,本篇文章就详细介绍一下。首先有关线程的使用会出现两个问题:线程是宝贵的内存资源、单个线程约占1MB空间,过多分配易造成内存溢出。频繁的创建及销毁线程会增加虚拟机回收频率、资源开销,造成性能下降。基于如上问题,出现了线程池:线程容器,可设定线程分配的数量。将预先创建的线程对象存入池中,并重用线程池中的线程对象。避免频繁的创建和销毁。原创 2023-08-29 07:00:00 · 727 阅读 · 0 评论 -
Java并发编程第5讲——volatile关键字(万字详解)
本篇文章从volatile的定义谈起,由于volatile与Java内存模型有较多的关联,所以接着介绍Java内存模型的相关概念、线程、主内存和工作内存之间的关系以及内存间的交互规则;随后详细介绍了volatile和synchronized在Java并发编程的三大特性——原子性、可见性和有序性中的表现(重点介绍volatile)。最后介绍了一下“重排序”、“内存屏障”和“先行发生原则(happens-before)”等重要概念。原创 2023-08-22 07:30:00 · 387 阅读 · 0 评论 -
Java并发编程第4讲——Java中的锁(万字详解)
本篇文章介绍了Java中的6种锁。从锁的相关概念开始,逐一详细介绍synchronized关键字、ReentrantLock、Condition接口、读写锁ReentrantReadWriteLock、读写性能之王StampedLock以及CAS乐观锁。内容涉及各个的概念、实现原理、特性、常用方法、代码示例以及相互之间的比较。原创 2023-08-11 07:30:00 · 557 阅读 · 1 评论 -
Java并发编程第3讲——线程安全
简单来说,就是多个线程同时访问共享变量时,得到的结果和我们预期的结果一样,就是线程安全。1 线程安全 1.1 谈谈你对线程安全的理解 1.2 Java中操作共享数据分类1.2.1 不可变(Immutable)1.2.2 绝对线程安全(Thread-safe)1.2.3相对线程安全(Thread-compatible)1.2.4线程兼容(Thread-adaptive)1.2.5线程对立(Thread-hostile)二、线程安全问题产生的原因及解决方式2.1 原因原创 2023-07-31 07:01:18 · 328 阅读 · 3 评论 -
Java并发编程第2讲——线程基础
本篇文章首先介绍了线程的基本概念、组成和特点,又使用JMX看了一下main方法的启动包含了几个线程。接着介绍了4种创建线程的方式,所以又介绍了run()和start()的区别(因为面试中有被问到过)。第三部分介绍了线程的6个状态以及它们之间的转换,并画了示意图。第四部分介绍了线程的sleep()、yield()、join()、setPriority()、setDaemon()等方法。怎么感觉面试的时候或多或少都被面试官问到过,死去的记忆又开始攻击我了。😅原创 2023-07-27 07:45:00 · 257 阅读 · 0 评论 -
Java并发编程第1讲——相关基础概念
本篇文章以“外卖小哥送外卖”为例...一、并发与并发编程的含义 1.1 并发 1.2 并发编程 二、为什么需要并发编程 三、线程与进程 3.1 什么是线程和进程 3.2 两者之间的区别与联系 3.2.1 区别 3.2.2 联系 四、并发编程的优势和挑战 4.1 优势 4.2 挑战 4.2.1 线程上下文切换 4.2.2 死锁 4.2.3资源限制 五、总结原创 2023-07-24 07:45:00 · 300 阅读 · 0 评论