JUC并发编程
JUC并发编程01——谈谈锁机制:轻量级锁、重量级锁、偏向锁、锁消除与锁优化
1.为什么要有并发编程计算机的cpu与I/O的效率并不是完全一致的,CPU的处理速度快时,在进行I/O操作时,可能会导致CPU空闲的状态,为了最打程度的利用cpu的资源,开发人员创造了并发编程,进程通过轮换可以最大程度的利用cpu的资源,同时给用户进程在同步执行的错觉。但是进程之间并不会共享数据,同时上下文的切换也比较耗时,线程横空出世,同一个进程中的不同线程之间内存共享一片内存区域,线程上下文切
日期 2023-06-12 10:48:40juc并发编程02——JMM模型
我们在这篇文章中将介绍JMM模型,也就是java内存模型。注意,本文所提到的JMM模型与JVM内存模型属于不同层次的内容。JVM内存模型讲的是物理内存空间的分配,而JMM则强调对于JVM内存模型的抽象。1.java内存模型在计算机中,为了解决主内存的速度跟不上处理器速度的问题,我们给每个处理器添加一级或多级高速缓存(如下图)。但是,每个处理器上缓存的数据如何保证一致性呢? 为了实现缓存数据的一致
日期 2023-06-12 10:48:40juc并发编程03——Lock与Condition接口
Lock与Condition接口前面两篇文章回顾了传统的synchronized关键字、JMM内存模型、volitile关键字,这篇文章开始我们正式介绍juc包。在jdk5之后,juc提供了Lock,与synchronized相似,都可以实现锁功能,但是需要手动获取锁和释放锁。不过它与synchronized又不太一样,synchronized关键字相当于是使用的其它类的monitor关联,在ma
日期 2023-06-12 10:48:40Juc并发编程04——可重入锁、公平锁与非公平锁
1.ReentrantLock使用介绍之前我们一直使用的Lock实例都用的是ReentrantLock,实际上,这是一种可重入锁。简单来说,就是对同一个线程可以进行多次的加锁操作。public class Demo11 { public static void main(String[] args) { Lock lock = new ReentrantLock();
日期 2023-06-12 10:48:40juc并发编程05——读写锁
可重入锁是一种排他锁,同一时间只允许一个线程操作竞争资源。读写锁是针对读、写场景设计的,允许多个线程同时持有锁。读写锁维护了一个读锁和一个写锁。其机制如下:没有其它线程占用写锁的情况下,同一时间可以有多个线程加读锁。没有任意线程占用读锁的情况下, 同一时间只有一个线程可以加写锁。简单总结就是要么读,要么写,允许多个线程同时读,只允许一个线程单独写。看看源码。public interface Rea
日期 2023-06-12 10:48:40Juc并发编程06——深入剖析队列同步器AQS源码
我们看下Reentrantock的源码。 public void lock() { sync.lock(); } public void unlock() { sync.release(1); }复制原来lock,unlock等核心方法都是通过sync来实现的。而sync其实是它的一个内部类。abstract static class S
日期 2023-06-12 10:48:40Juc并发编程07——公平锁真的公平吗(源码剖析)
先来回顾下公平锁的tryAcquire代码。 protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) {
日期 2023-06-12 10:48:40Juc并发编程08——Condition实现源码分析
看看ReentrantLock中的newCondition方法final ConditionObject newCondition() { return new ConditionObject(); }复制再点进去发现原来就是AQS中的内部类。 public class ConditionObject implements Condition, java.io.Serializable
日期 2023-06-12 10:48:40Juc并发编程09——自己动手实现排他锁
我们已经了解了AQS的的基本原理了,不如自己仿照其它锁实现一个排他锁吧。要求如下:同一时间只允许一个线程持有锁,不要求可重入(反复加锁直接忽视即可)。(1)实现Lock接口public class Demo23 { public static void main(String[] args) { } private static class myLock impleme
日期 2023-06-12 10:48:40Juc并发编程10——原子类与ABA问题解决方案
除了加锁以外,还可以使用原子类实现操作原子性。它底层采用CAS算法,使用简单、性能高效、线程安全。简单示范下它的使用。public class Demo24 { public static void main(String[] args) { AtomicInteger integer = new AtomicInteger(1); // 不能向Integer一样自动装箱
日期 2023-06-12 10:48:40Juc并发编程11——深入源码:常用并发容器、阻塞队列使用与原理
前言本文将介绍常用的并发容器,比较传统容器与并发容器的区别,介绍并发容器的基本原理。是面试常考、工作常用的热门知识点。深入源码:常用并发容器、阻塞队列使用与原理前言1.传统容器安全吗?2.常用并发容器介绍2.1 CopyOnWriteArrayList2.2 ConcurrentHashMap3.阻塞队列3.1 阻塞队列的介绍3.2 ArrayBlockingQueue源码分析3.3 Synchr
日期 2023-06-12 10:48:40Juc并发编程12——2万字深入源码:线程池这篇真的讲解的透透的了
本文将介绍常见的线程池的使用方法,介绍线程池的参数、拒绝策略、返回参数获取以及定时调度。 2万字深入源码:线程池这篇真的讲解的透透的了1.线程池介绍2.线程池的使用2.1 构造方法参数详解2.2 线程池使用示例2.3 线程池的拒绝策略2.4 线程创建工厂2.5 线程异常3.使用Executors创建线程池3.1 newFixedThreadPool3.2 newSingleThreadExecu
日期 2023-06-12 10:48:40Java的juc并发编程包
Juc并发编程包一、介绍关于Java如何创建线程,大家都可以马上能想到有两种方法,无非不就是继承 Thread类和实现 Runnable接口嘛,顶多再加上个实现 Callable接口。而且 synchronized解决并发问题,如果学艺不精,锁住的对象是哪个都不知道,实在是不友好。所以,我们在企业开发中基本不这样使用线程。在线程的启动上,我们常使用线程池。对于线程池的使用,可以看我另一篇博客,讲到
日期 2023-06-12 10:48:40玩转JUC工具,Java并发编程不再危机四伏
前言 当今互联网应用普遍需要支持高并发访问,而Java作为一种广泛使用的编程语言,其并发编程能力对于实现高性能的应用非常重要。而Java的JUC(java.util.concurrent)并发工具就提供了许多实用的工具类和接口,可以让Java应用轻松实现高效的并发编程。ReetrantLock ReentrantLock是Java提供的一个可重入锁,也是Java并发编程中最常用的一种锁。与sy
日期 2023-06-12 10:48:40【并发编程】JUC并发编程(彻底搞懂JUC)
文章目录 一、背景二、什么是JUC?三、JUC框架结构四、JUC框架概述五、JUC中常用类汇总六、相关名词进程和线程进程线程创建线程的几种常见的方式 并发和并行用户线程和守护线程 七
日期 2023-06-12 10:48:40JUC 并发编程学习笔记(总)
文章目录 1. 什么是JUC2. 进程和线程2.1 进程2.2 线程2.3 并发2.4 并行2.5 线程的状态2.6 wait 和 sleep 的区别 3. Lock锁(重点)
日期 2023-06-12 10:48:40JUC 并发编程学习笔记(下)
文章目录 1. 四大函数式接口(必须掌握)2. Stream流式计算3. ForkJoin4. 异步回调5. JMM6. Volatile7. 单例模式8. 深入理解CAS9. 原子
日期 2023-06-12 10:48:40JUC 并发编程学习笔记(中)
文章目录 1. 集合类不安全1.1 List不安全1.2 Set不安全1.3 Map不安全 2. Callable(简单)3. 常用的辅助类(必会)3.1 CountDownL
日期 2023-06-12 10:48:40JUC 并发编程学习笔记(上)
文章目录 1. 什么是JUC2. 进程和线程2.1 进程2.2 线程2.3 并发2.4 并行2.5 线程的状态2.6 wait 和 sleep 的区别 3. Lock锁(重点)
日期 2023-06-12 10:48:40【JUC 并发编程】JUC 基本概念
❤️ 个人主页:水滴技术 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬 🌸 订阅专栏:Jav
日期 2023-06-12 10:48:40