【Java并发专题】
文章平均质量分 86
【Java并发专题】
青山师
编码、架构、程序人生;此博客输出内容永久免费,长期分享JAVA开发技术
展开
-
线程池的介绍、原理、监控运维、框架使用场景案例
JDK 提供的线程池功能较基础,开源框架 Executors 在此基础上做了许多封装,更加易用。主要有:- newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。- newFixedThreadPool: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。- newScheduledThreadPool: 创建一个定长线程池,支持定时及周期性任务执行。- newSingleThreadExecuto原创 2023-05-03 20:19:47 · 1176 阅读 · 0 评论 -
synchronized的偏向、轻量、重量级锁
Synchronized实现同步的方式有三种:偏向锁、轻量级锁、重量级锁。本文会从理论和代码实践两方面阐述三种锁的实现细节和原理。原创 2023-05-02 22:47:16 · 1007 阅读 · 1 评论 -
JAVA并发万字长文从ReentrantLock到juc框架
ReentrantLock 是通过一个volatile 的变量和一个 FIFO 的队列来实现的。该 volatile 变量表示当前获得锁的线程,FIFO 队列用来存储等待锁的线程。具体实现方式是:当一个线程获取锁时,将当前线程设置为 volatile 变量的值。如果其他线程试图获取该锁,则会加入 FIFO 队列的尾部,并标记为等待状态。当持有锁的线程释放锁时,它会唤醒 FIFO 队列头部的线程,这个线程继续执行并获取锁。ReentrantLock 是可重入锁,意味着同一个线程可以多次获取这把锁。这是原创 2023-05-02 20:53:28 · 1025 阅读 · 0 评论 -
volatile关键字原理的使用介绍和底层原理解析和使用实例
volatile 关键字的主要作用是保证可见性和有序性,禁止编译器优化。保证可见性:当一个变量被声明为 volatile 之后,每次读取这个变量的值都会从主内存中读取,而不是从缓存中读取,这就保证了不同线程对这个变量操作的可见性。有序性:volatile 关键字保证了不同线程对一个 volatile 变量的读写操作的有序性。禁止编译器优化:编译器会对代码进行各种优化来提高性能,但是这些优化也可能让同步代码失效。volatile 关键字告诉编译器不要对这段代码做优化,从而避免一些不正确的优化。原创 2023-05-02 17:11:46 · 1475 阅读 · 0 评论 -
ThreadLocal的使用介绍和底层原理解析和开源框架的使用实例
ThreadLocal是一个线程内部的数据存储类,它可以为每个线程提供独立的变量副本,不同线程间的变量无法相互访问和修改。这避免了每个线程都要维护一套独立变量的麻烦,并且也减少了线程之间不必要的数据争用。ThreadLocal适用于这样的场景:每个线程需要有自己单独的实例,而不是共享实例。例如,在 web 应用中,每个请求被一个新的线程处理,每个线程需要有自己的变量实例。原创 2023-05-02 15:07:43 · 1903 阅读 · 0 评论 -
Redis缓存MySQL数据库存储二者如何保证数据一致性
Redis缓存MySQL数据库存储二者如何保证数据一致性,既可以同步更新缓存,也可以异步更新缓存。同步更新缓存能够保证数据一致性,但会对写操作的性能产生影响;异步更新缓存则能够避免这个问题,但需要引入消息队列,并且也需要考虑缓存更新失败的情况。根据实际情况选择不同的方案即可。原创 2023-04-19 10:10:01 · 819 阅读 · 0 评论 -
Java缓存穿透、击穿、雪崩解决方案
针对缓存穿透、击穿和雪崩问题,我们可以采用布隆过滤器、分布式锁和多级缓存策略等技术手段来进行优化。在实际项目中,需要根据具体情况选择合适的解决方案,并进行适当的调整和配置,以达到最佳的性能和稳定性。原创 2023-04-18 21:03:11 · 976 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore 的原理以及实例总结
在Java多线程编程中,有三种常见的同步工具类:CountDownLatch、CyclicBarrier、Semaphore。这些工具类使得我们可以在多个线程之间进行协调,实现更高效的并发处理。本文将对它们的原理和实例进行分析总结。本文分析了CountDownLatch、CyclicBarrier、Semaphore三种常见的同步工具类的原理和实例。这些工具类可以帮助我们在多个线程之间进行协调,实现更高效的并发编程。原创 2023-04-14 11:56:50 · 793 阅读 · 0 评论 -
HashMap的关键性源代码进行解读
对于相同的键,hashCode()方法返回的哈希值是相同的,但是对于不同的键,哈希值不一定不同,因此在映射到数组下标位置时可能会出现冲突。下面我将结合HashMap的源码,深入讲解HashMap的实现细节和背后的实现原理。需要注意的是,扩容是一项比较耗费性能的操作,所以如果可以预测 HashMap 的元素数量,应该在创建 HashMap 时设置其初始容量,避免在后续使用过程中频繁扩容。先通过哈希函数计算键的哈希值,然后找到对应桶中的链表(或红黑树),再逐一遍历链表(或查找红黑树),直到找到对应的键值对。原创 2023-04-13 20:19:53 · 612 阅读 · 0 评论 -
Netty的高性能体现在哪些方面
相比传统的阻塞式IO模型,在多个客户端请求的情况下,非阻塞式IO模型可以减少线程数量,提高了应用程序的并发性能。综上所述,Netty通过采用非阻塞I/O、零拷贝、内存池以及合理的线程模型等技术手段来提高网络应用程序的性能和可伸缩性。在实际的开发工作中,我们可以根据具体的需求,选择合适的Netty组件和框架来构建高效稳定的网络应用程序。相比之下,Netty使用了零拷贝技术,即数据直接从操作系统内存缓冲区传输到网络协议栈或者应用程序中,完全避免了数据在内核态和用户态之间的拷贝。原创 2023-04-13 16:46:07 · 1019 阅读 · 0 评论 -
Netty的线程模型
线程模型指的是Netty在处理网络I/O事件时使用的线程池模型。它包括两个方面:线程池类型和线程池大小。单线程池模型:所有的I/O操作都由一个线程来处理。多线程池模型:所有的I/O操作都由多个线程来处理,每个线程都有自己的事件循环。主从多线程池模型:一个线程池用于处理连接请求,另一个线程池用于处理I/O操作。这种模型可以减少连接请求处理对I/O操作的干扰,从而提高系统并发性能。线程池大小根据应用程序的负载情况进行调整。原创 2023-04-12 23:38:14 · 749 阅读 · 0 评论 -
从BIO到NIO、AIO和零拷贝
在BIO模型中,所有的I/O操作都是阻塞的,也就是说,当一个线程调用read()或write()时,该线程会被阻塞,直到有数据可读或写入成功。AIO(Asynchronous I/O)异步I/O模型是在NIO模型的基础上又做了一些改进,它将I/O操作的具体实现委托给内核,直接由内核进行读写操作,当数据读写完成后再回调到应用层,这样就不需要像BIO、NIO模型那样由用户线程进行数据读取和写入,从而减少了系统调用的次数,充分利用了系统的资源。零拷贝技术指避免CPU从应用缓冲区向内核缓冲区拷贝数据的一种技术。原创 2023-04-11 23:33:09 · 666 阅读 · 0 评论 -
分布式ID介绍及实际解决方案
在分布式系统中,生成全局唯一的ID是一个常见的需求。但是,在分布式系统中,单机生成的ID难以保证全局唯一性,因此需要一种分布式ID生成方案。本文介绍了三种常见的分布式ID生成方案:UUID、自增ID和Snowflake算法,并且详细介绍了Snowflake算法的实现方式。在实际使用中,可以根据具体场景选择合适的方案。对于要求ID有序递增、长度较短的场景,建议使用Snowflake算法。原创 2023-04-06 20:53:32 · 686 阅读 · 0 评论 -
生产环境常见的限流算法
在高并发场景下,为了保护系统的稳定性和可用性,需要对请求进行限流。本文介绍几种生产环境中常见的限流算法,并结合Java代码实现。原创 2023-04-06 20:34:52 · 544 阅读 · 0 评论 -
JDK8并发编程实战源码探究系列(一)并发包概览
一线大厂招聘,高并发系统研发,进阶高级程序员…并发编程是必须掌握的技能。而深究其原理、源码才能写出高质量的代码。JDK8并发编程实战源码探究系列涉及java.util.concurrent 包几乎所有类或者接口的原理、使用实战、源码讲解。中间可能还会穿插计算机原理底层、CPU、操作系统、JMM、字节码分析等知识点,更深刻、全方位掌握并发编程。JDK8并发包概览以下信息依据 openjdk8...原创 2020-04-15 21:14:57 · 819 阅读 · 0 评论 -
生产者-消费者模式的多种实现
文章目录生产者-消费者模式的多种实现1. 生产者-消费者模式介绍2. 考核技术点2.1 线程间通信的知识点2.1.1 wait-notify2.1.2 JDK的阻塞队列BlockingQueue2.1.2 条件信号3. 多种实现方式3.1 JDK自带的BlockingQueue实现3.2 synchronized+wait+notifyAll实现3.3 ReentrantLock+Conditio...原创 2020-03-26 17:49:21 · 490 阅读 · 0 评论 -
Unsafe-java的魔法类-AtomicInteger的原子操作
Unsafe-java的魔法类Unsafe的介绍Unsafe的源代码:http://www.docjar.com/html/api/sun/misc/Unsafe.java.htmlUnsafe类全限定名为sun.misc.Unsafe,顾名思义不是安全的。一般而言,编写底层代码或者影响JVM是很难实现的,当然你可以使用JNI来达到目的,JNI需要和C打交道。在java平台通过sun...原创 2020-03-25 01:42:32 · 477 阅读 · 0 评论