white camel
星光不问赶路人, 时光不负有心人
展开
-
Java并发编程(十一) : JUC 之 ReentrantReadWriteLock、StampedLock、Semaphore(信号量)、CountdownLatch、CyclicBarrier
ReentrantReadWriteLock、StampedLock、Semaphore(信号量)、CountdownLatch、CyclicBarrier原创 2022-08-08 17:06:06 · 302 阅读 · 0 评论 -
Java并发编程(十) : JUC 之 AQS原理、ReentrantLock原理
J.U.C8.2.1 AQS 原理概述:全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - cas 机制设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源原创 2021-08-03 10:13:08 · 1854 阅读 · 1 评论 -
Java并发编程(九) : 线程池详解、ThreadPoolExecutor、ScheduledExecutorService、Fork/Join
8. 共享模型之工具8.1 线程池池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线原创 2021-01-18 10:14:43 · 2292 阅读 · 4 评论 -
Java并发编程(八) : 不可变对象设计(String保护性拷贝)、final的使用、享元模式
源码之 LongAdderLongAdder 类有几个关键域// 累加单元数组, 懒惰初始化transient volatile Cell[] cells;// 基础值, 如果没有竞争, 则用 cas 累加这个域transient volatile long base;// 在 cells 创建或扩容时, 置为 1, 表示加锁transient volatile int cellsBusy;cas 锁使用cas实现一个自旋锁// 不要用于生产实践!!!public class Loc原创 2021-01-17 12:07:56 · 1051 阅读 · 2 评论 -
Java并发编程(七) : CAS概念、原子操作类(乐观锁思想)、LongAddr和AtomicLong、Unsafe
6. 共享模型之无锁管程即monitor是阻塞式的悲观锁实现并发控制,这章我们将通过非阻塞式的乐观锁的来实现并发控制6.1 问题提出有如下需求,保证account.withdraw取款方法的线程安全 Test5.javapublic class Test5 { public static void main(String[] args) { Account.demo(new AccountUnsafe(10000)); }}class AccountUnsaf原创 2021-01-17 11:04:36 · 1879 阅读 · 0 评论 -
Java并发编程(六) : Java内存模型(JMM-原子性、可见性、有序性)、volatile原理、volatile保证可见性, 有序性、单例设计模式(各种实现分析)
共享模型之内存之前讲的synchronized底层Monitor主要关注的是访问共享变量时,保证临界区代码的 原子性 。下面进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题一、 Java 内存模型JMM 即 Java Memory Model ,它从Java层面定义了主存、工作内存抽象概念,底层对应着CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cp原创 2021-01-11 18:09:33 · 1868 阅读 · 0 评论 -
Java并发编程(五) : 死锁、哲学家就餐问题、ReentrantLock (锁重入、锁超时、可中断、公平锁、条件变量)、同步模式之顺序控制
4.9 活跃性活跃性相关的一系列问题都可以用ReentrantLock进行解决。4.9.1 死锁有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁t1 线程获得A对象锁,接下来想获取B对象的锁;t2 线程获得B对象锁,接下来想获取A对象的锁例。Test28.java4.9.2 检测死锁检测死锁可以使用 jconsole工具;或者使用 jps 定位进程 id,再用 jstack 定位死锁:Test28.java下面使用jstack工具进行演示D:\我的项目\JavaLearing\ja原创 2021-01-10 19:20:17 · 2330 阅读 · 1 评论 -
Java并发编程(四) : wait和notify原理、同步模式之保护性暂停、异步模式之生产者/消费者、park和unpark原理、线程状态转换
4.6 wait和notify建议先看看wait和notify方法的javadoc文档4.6.1同步模式之保护性暂停即 Guarded Suspension,用在一个线程等待另一个线程的执行结果,要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式代码:Test22原创 2021-01-06 14:29:59 · 2240 阅读 · 2 评论 -
Java并发编程(三) : synchronized底层原理、优化Monitor重量级锁、轻量级锁、自旋锁(优化重量级锁竞争)、偏向锁
一、 Monitor 概念1、 Java 对象头对象头对象头包含两部分:运行时元数据(Mark Word)和类型指针 (Klass Word)运行时元数据哈希值(HashCode),可以看作是堆中对象的地址GC分代年龄(年龄计数器)锁状态标志线程持有的锁偏向线程ID偏向时间戳类型指针指向类元数据InstanceKlass,确定该对象所属的类型。指向的其实是方法区中存放的类元信息说明:如果对象是数组,还需要记录数组的长度以 32 位虚拟机为例,普通对象的对象头原创 2021-01-02 19:05:46 · 3442 阅读 · 9 评论 -
Java并发编程(二) : 线程安全问题、synchronized保证线程安全、private或final的重要性、线程八锁问题分析、变量的线程安全分析
承接上文:一、 线程问题1、 线程出现问题的根本原因分析线程出现问题的根本原因是因为线程上下文切换,导致线程里的指令没有执行完就切换执行其它线程了,下面举一个例子public class Test { static int count = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(()->{ for .原创 2020-12-25 14:44:30 · 3063 阅读 · 3 评论 -
Java并发编程 一 线程介绍、创建线程的4种方式、线程常用方法、两阶段终止状态、线程的五种/六种状态
一、线程与进程、并行并发、同步异步概念1、进程与进程进程: 资源分配的最小单位进程是线程的容器, 一个进程中包含多个线程, 真正执行任务的是线程线程: 资源调度的最小单位进程程序由指令和数据组成,但是这些 指令要运行,数据要读写,就必须将指令加载到cpu,数据加载至内存。在指令运行过程中还需要用到磁盘,网络等设备,进程就是用来加载指令,管理内存,管理IO的当一个指令被运行,从磁盘加载这个程序的代码到内存,这时候就开启了一个进程进程就可以视为程序的一个实例,大部分程序都可以运行多原创 2020-12-22 18:27:54 · 3718 阅读 · 0 评论 -
学习《Java并发编程》目录索引 (持续更新中)
写在前面:此系列为本人学习黑马《Java并发编程》所整理的笔记 !不局限于应用层开发, 更加深入理解多线程, 并发编程, 更有利于我们长久发展 !学习Java并发编程原创 2020-12-20 18:43:56 · 12532 阅读 · 16 评论