并发编程
文章平均质量分 95
并发编程
Kim_smile
Be brave to try
展开
-
synchronized底层原理与锁升级
文章目录使用底层原理修饰代码块修饰方法Monitor 对象Java 对象头锁升级无锁偏向锁为什么引入偏向锁?实现原理撤销偏向锁轻量级锁自旋锁重量级锁锁对比其他优化synchronized三大特性synchronized 和 volatile 的区别synchronized 关键字解决的是多个线程之间访问资源的同步性,即保证线程同步,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized 属于 重量级锁,效率.原创 2021-11-28 20:52:02 · 388 阅读 · 0 评论 -
深入理解volatile底层原理
文章目录volatile的特性volatile实现内存可见性原理volatile实现有序性原理volatile 内存语义的实现什么是内存屏障双重检查锁下的重排序问题volatile 是轻量级的 synchronized,一般作用于变量。相比于synchronized关键字,volatile关键字的执行成本更低,因为它不会引起线程上下文的切换和调度。volatile主要有以下两个功能:保证共享变量的内存可见性(即当一个线程修改一个共享变量时,另一个线程能读到这个修改的值)。禁止指令重排序vo.原创 2021-11-28 20:45:12 · 307 阅读 · 0 评论 -
并发编程的艺术——Java内存模型(指令重排序、happens-before)
文章目录什么是 Java 内存模型Java 内存模型的组成部分JMM 与 Java 内存区域划分的区别与联系指令重排序指令重排序必须满足什么条件as-if-serial 语义数据依赖性happens-beforehappens-before规则(先行发生原则)什么是 Java 内存模型Java 内存模型Java Memory Model是一种抽象的概念,并不真实存在,它描述了一组规则或规范,通过这组规范定义了程序中共享变量(包括实例字段、静态字段和数组元素)的访问方式。在 Java 中,所有实例字段.原创 2021-11-28 20:37:05 · 179 阅读 · 0 评论 -
AQS原理与ReentrantLock源码分析
文章目录AQS 原理资源共享方式AQS 底层基于模板方法模式AQS 源码分析获取资源释放资源以 ReentrantLock 为例获取资源流程图AQS 的全称为 AbstractQueuedSynchronizer,即抽象队列同步器,这个类在java.util.concurrent.locks包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出大量应用广泛的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWri原创 2021-11-28 20:32:27 · 288 阅读 · 0 评论 -
ThreadLocal原理以及内存泄漏问题
文章目录什么是ThreadLocal?有哪些应用场景?ThreadLocal 原理ThreadLocal 内存泄漏问题为什么要将key设计成ThreadLocal的弱引用?什么是ThreadLocal?有哪些应用场景?ThreadLocal类可以让每个线程绑定自己的值,也就是拥有自己的专属本地变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量,并且不会和其他线程的变量冲突,实现了线程间的数据隔离,避免了线程安全问题。ThreadLocal的应用原创 2021-11-27 23:26:04 · 1034 阅读 · 0 评论 -
Java线程池实现原理与ThreadPoolExector详解
线程池(Thread Pool)是一种基于池化思想管理线程的工具。为什么要使用线程池?降低资源消耗:通过池化技术重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池S原创 2021-11-23 23:54:40 · 727 阅读 · 0 评论 -
Java中的阻塞队列BlockingQueue
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满,如 put() 方法。支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空,如 take() 方法。BlockingQueue 常用于生产者-消费者场景,生产者是往队列里添加元素的线程,消费者是从队列里取元素的线程。BlockingQueue就是存放元素的容器。阻塞队列提供了四组不同的方法用于插入、移除原创 2021-11-22 23:36:44 · 526 阅读 · 0 评论