随笔分类 - Java多线程
摘要:
1 ThreadLocol基本认识 上图中每个线程都拥有自己的ThreadLocal实例对象,将该对象作为key,在hreadLocalMap的获取线程私有的变量值(object类型的value)。 1-1 概述 ThreadLocal作用:通过每个线程内部的ThreadLocalMap的key(T
阅读全文

摘要:一 ConcurrentHashMap原理(JDK1.8的实现) 1-1 重要属性与内部类 sizeCtl; // size control:懒惰 初始化, 1-1-1 四个内部类 1)内部类Node(静态内部类) 主要包含了键,值,hash码,next指针。 static class Node<K
阅读全文
摘要:一 Java线程安全类的概述 | 类的名称 | 特点 | 说明 | | | | | | Stack,Vector,Hashtable | 采用synchronized保证线程安全性 | 不推荐使用,属于历史遗留类,采用synchronized保证安全性 | | Collections synchro
阅读全文
摘要:1 Semaphore的使用与原理 [ˈsɛməˌfɔr, -ˌfor] 1-1 概述 应用场景:用来限制能同时访问共享资源的线程上限 实例:每个时刻最多三个线程访问资源 package chapter8; import lombok.extern.slf4j.Slf4j; import java.
阅读全文
摘要:1 ReentrantReadWriteLock原理 1-1 概述 ReentrantReadWriteLock相关方法 1)内部实现了AQS的同步器Sync,并派生出NonfairSync与FairSync两个同步器子类(见下面源码) 读锁与写锁是共用一个同步器的,所以等待队列,锁的state也是
阅读全文
摘要:1 读写锁介绍以及简单的使用 1-1 概述 读写锁应用场景:当读操作远远高于写操作时,这时候使用 读写锁 让 读-读 可以并发,提高性能。 类似于数据库中的共享锁: select ... from ... lock in share mode 读写锁中要求读读操作是并发的,读和写操作是互斥的 JUC
阅读全文
摘要:一 AQS介绍与简单应用 AQS相关方法介绍 1-1 概述 定义:AbstractQueuedSynchronizer(抽象队列同步器) ,是阻塞式锁和相关同步器工具的框架(其他的同步器都是基于AQS,调用AQS的方法) 特点: 1)用 state 属性来表示资源的状态(分独占模式和共享模式),子类
阅读全文
摘要:1 任务调度线程池的应用(固定时间点执行任务) 需求:每周四18:00开始执行一个任务。 package chapter8; import java.time.DayOfWeek; import java.time.Duration; import java.time.LocalDateTime;
阅读全文
摘要:一、自定义线程池的实现 1-1 线程池的组成概述 线程池基本思想:创建一批线程,让这批线程得到频繁的利用。 减少线程对于资源的占用 减少线程上下文切换的开销。 自定义线程池的组成: 1)线程池(图中左边部分):线程池中有多个线程。 2)阻塞队列:生产者和消费者模式下,平衡任务产生与消费的组件 线程池
阅读全文
摘要:一 不可变对象的设计与实现 1-1 为什么需要不可变类(可变类在多线程环境下的安全性实例) 不可变类具有线程安全的特点 SimpleDateFormat类的使用问题 package chapter7; import lombok.extern.slf4j.Slf4j; import java.tex
阅读全文
摘要:一 无锁机制的应用场景与基本原理(CAS操作) 1-1 CAS的应用场景 账户取款问题:如何确保多线程环境下,账户的取款没有出现问题。 采用三种方式: 不对公共变量上锁(不安全) 使用synchronized 采用CAS的无锁机制 package chapter6; import java.util
阅读全文
摘要:1)Java的内存模型的组成以及内存模型需要解决的三个问题:原子性,可见性,有序性 2)可见性的happens-before原则和volatile 3)volatile与有序性的关系
阅读全文
摘要:1 JAVA中多把锁的使用基本常识 1-1 多把锁的简单例子 package chapter4; import lombok.extern.slf4j.Slf4j; @Slf4j(topic = "c.test3") class BigRoom { public void sleep() throw
阅读全文
摘要:1 park与unpark的使用以及原理 1-1 基本使用 park/unpark并非线程类的方法,是concurrent的方法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象) 实例: package cha
阅读全文
摘要:3 Java中wait/notify 3-1 原理 如上图所示: step1:线程1之前获得过Monitor,在执行临界区代码时发现部分条件不满足,无法执行完代码,因此主动调用wait让出坑位,自己进入WaitSet ,让其他阻塞的线程能够获得Monitor,避免浪费资源。 step2: 线程1主动
阅读全文
摘要:1 基本概念 案例:采用2个无关联的线程对同一变量进行操作,一个进行5000次自增操作,另外一个进行5000次自减操作。 最终变量的结果是不确定的(2个算数操作的操作指令由于多线程原因会交错在一起)。 **临界区(critical section):**对共享资源进行多线程读写操作的代码块。 **竞
阅读全文
摘要:2 进程与线程 进程:可以视为程序的一个实例,有的程序可以开启多个实例,比如浏览器。有的只能一个实例,比如网易云音乐。 线程:进程包含多个线程,是一个指令流,是JAVA中最小的调度与资源分配单位,在windows中进程是不活动的,只是线程的容器。 从资源占用,与通信方法二个角度进行对比,对比进程之间
阅读全文