- 博客(21)
- 收藏
- 关注
原创 AQS详解与源码分析
文章目录AQS详解与源码分析AQS介绍AQS原理分析AQS原理概述AQS的使用AQS与锁的关系AQS对资源的共享方式模板方法设计模式AQS底层使用模板方法模式模板方法模式自定义同步器时需要重写的模板方法模板方法的分类自定义同步组件AQS核心同步队列独占锁独占锁的获取(acquire()方法)独占锁的释放(release()方法)独占锁总结独占锁特性学习可中断式获取锁(acquireInterruptibly()方法)超时等待式获取锁(tryAcquireNanos()方法)共享锁共享锁的获取(acquire
2021-03-28 17:38:45
593
原创 ZooKeeper
文章目录ZooKeeper一、ZooKeeper概述二、ZooKeeper命令操作1.ZooKeeper数据模型2.ZooKeeper服务端常用命令3.ZooKeeper客户端常用命令三、ZooKeeperJavaAPI操作1.Curator介绍2.Curator API常用操作3.分布式锁1.分布式锁概述2.分布式锁原理3.Curator实现分布式锁API四、Zookeeper集群搭建1.ZooKeeper集群介绍2.ZooKeeper集群搭建五、ZooKeeper核心理论1.ZooKeeper集群角色2
2021-03-17 20:32:59
481
原创 Dubbo
Dubbo一、相关概念1.互联网项目架构特点用户多流量大,并发高海量数据易受攻击功能繁琐变更快2.互联网项目架构目标衡量网站的性能指标响应时间:指执行一个请求从开始到最后收到响应数据所花费的总体时间并发数:指系统同时能处理的请求数量并发连接数:指的是客户端向服务器发起请求,并建立了TCP连接,每秒钟服务器连接的总TCP数量请求数:称为QPS(Query Per Second)指每秒多少请求并发用户数:单位时间内有多少用户吞吐量:指单位时间内系统
2021-03-16 18:17:59
492
2
原创 Docker
Day67-Docker一、Docker概述1.Docker概念Docker是一个开源的应用容器引擎诞生于2013年初,基于Go语言实现, dotCloud 公司出品(后改名为Docker Inc)Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上容器是完全使用沙箱机制,相互隔离容器性能开销极低Docker从17.03版本之后分为CE(Community Edition: 社区版) 和EE(Enterprise Edition
2021-03-15 15:53:26
206
原创 第3章 文件
第3章 文件参数文件:告诉MySQL实例启动时在哪里找到数据库文件,并且指定某些初始化参数日志文件:记录MySQL实例对某种条件做出响应时写入的文件套接字文件:用UNIX域套接字方式进行连接时需要的文件pid文件:MySQL实例的进程ID文件MySQL表结构文件:存放MySQL表结构定义文件存储引擎文件:存储引擎存储的记录和索引等数据3.1 参数文件当MySQL实例启动时,数据库会先读取一个配置参数文件用来寻找数据库的各种文件所在位置以及指定某些初始化参数,参数通常定义了内存结构的
2021-03-03 17:37:00
633
4
原创 第2章 InnoDB存储引擎
第2章 InnoDB存储引擎2.1 InnoDB存储引擎概述通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎InnoDB存储引擎是第一个完整支持ACID事务的MySQL存储引擎BDB是第一个支持事务的MySQL存储引擎2.2 InnoDB存储引擎版本MySQL 5.1版本支持两个版本的InnoDB老版本InnoDB(静态编译)InnoDB Plugin(动态加载)——InnoDB 1.0.xMySQL 5.5版本支持InnoDB 1.1.xMySQL 5.6
2021-03-03 17:35:24
914
2
原创 第1章 MySQL体系结构和存储引擎
第1章 MySQL体系结构和存储引擎1.1 定义数据库和实例数据库物理操作系统文件或其他形式文件类型的集合实例MySQL数据库由后台线程以及一个共享内存区组成共享内存可以被运行的后台线程共享数据库实例是真正用于操作数据库文件的在MySQL数据库中,实例与数据库通常是一一对应的即一个实例对应一个数据库,一个数据库对应一个实例,但在集群情况下可能存在一个数据库被多个数据实例使用的情况MySQL被设计为一个单进程多线程架构的数据库,即MySQL数据库实例在系统上表现就是一个进程
2021-03-03 17:32:18
294
2
原创 第12章 Java内存模型与线程
第12章 Java内存模型与线程12.1 概述略12.2 硬件的效率与一致性计算机的存储设备与处理器的运算速度有着几个数量级的差距现代计算机不得不加入一层或多层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之前的缓冲将运算需要使用的数据复制到缓存中,让运算能够快速运行,当运算结束后再从缓存同步回内存中除了增加高速缓存以外,为了使处理器内部的运算单元能尽量被充分运用,处理器可能会对输入代码进行乱序执行优化,即指令重排序优化在多核处理器系统中,每个处理器都拥有自己的高读
2021-03-03 17:29:38
67
1
原创 第7章 虚拟机类加载时机
第7章 虚拟机类加载时机7.1 概述Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能被运行和使用Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,该过程被称作虚拟机的类加载机制Java语言里类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略让Java语言进行提前编译会面临额外的困难,也会让类加载时增加性能开销,但Java可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现
2021-03-03 17:17:02
66
2
原创 第3章 垃圾收集器与内存分配策略
第3章 垃圾收集器与内存分配策略3.1 概述3.2 对象已死?3.2.1 引用计数算法略3.2.2 可达性分析算法Java技术体系中固定可作为GC Roots的对象在虚拟机栈中引用的对象在方法区中类静态属性引用的对象在方法区中常量引用的对象在本地方法栈中本地方法引用的对象Java虚拟机内部的引用所有被同步锁持有的对象根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象临时加入,共同构建完整的GC Roots集合如果只针对Java堆中某一块区域发起垃圾
2021-03-03 17:14:31
687
2
原创 第2章 Java内存区域与内存溢出异常
第2章 Java内存区域与内存溢出异常2.1 概述2.2 运行时数据区域2.2.1 程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令Java虚拟机中的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的。在任何一个确定的时间,一个处理器都只会执行一条线程中的指令为了保证在线程切换后能恢复到正确的执行位置,这个时候每条线程就都需要一个独立的程序计数器,而各线程之间计数器是互
2021-03-03 17:11:58
326
1
原创 第10章 Executor框架
第10章 Executor框架Java的线程既是工作单元,也是执行机制从JDK 5开始,把工作单元与执行机制分离开来工作单元包括Runnable和Callable执行机制由Executor框架提供10.1 Executor框架简介10.1.1 Executor框架的两级调度模型在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程Java线程启动时会创建一个本地操作系统线程该Java线程终止时,这个操作系统线程也会
2021-03-02 18:47:39
85
1
原创 第9章 Java中的线程池
第9章 Java中的线程池使用线程池能带来的好处降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度当任务到达时,任务可以不需要等到线程创建就能立即执行提高线程的可管理性线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控9.1 线程池的实现原理当提交一个新任务到线程池时线程池判断核心线程池里的线程是否都在执行任务如果不是,则创建一个新的工作线程来执行任务如果核心
2021-03-02 18:38:49
61
原创 第8章 Java中的并发工具类
第8章 Java中的并发工具类在JDK的并发包里提供了几个非常有用的并发工具类CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段Exchanger工具类则提供了在线程间交换数据的一种手段8.1 等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作JDK 1.5之后并发包提供的CountDownLatch也可以实现join的功能,并且比join的功能更多CountDo
2021-03-02 18:35:03
71
原创 第7章 Java中的13个原子操作类
第7章 Java中的13个原子操作类线程不安全的更新操作,通常会使用synchronized来解决问题从JDK 1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)Atomic包里的类基本都是使用Unsafe实现的包装类7.1 原子更新基本类型类使用原子的方
2021-03-02 18:34:19
59
原创 第6章 Java并发容器和框架
第6章 Java并发容器和框架6.1 ConcurrentHashMap的实现原理与使用6.1.1 为什么要使用ConcurrentHashMapHashMap可能会导致程序死循环HashTable效率低ConcurrentHashMap使用锁分段技术提升并发访问率6.1.2 ConcurrentHashMap的结构ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成Segment是可重入锁(ReentrantLock),HashEntry则用于
2021-03-02 18:31:53
90
原创 第5章 Java中的锁
第5章 Java中的锁5.1 Lock接口如果在try-finally外加锁,如果因为发生异常导致加锁失败,try-finally块中的代码不会执行如果在try{}代码块中加锁失败,finally中的代码无论如何都会执行,但是由于当前线程加锁失败并没有持有lock锁,所以程序会抛出异常5.2 队列同步器队列同步器AbstractQueuedSynchronizer(简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源
2021-03-02 18:24:27
75
原创 第4章 Java并发编程基础
第4章 Java并发编程基础4.1 线程简介4.1.1 什么是线程现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process)在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行4.1.2 为什么要使用多线程更多的处理器核心线程是大多数操作系统调度的基本单元,一个程序作为一个进程来运行,程序运行过程中能够创建多个线程,而一个线程在一个时刻只
2021-03-02 18:14:54
62
原创 第3章 Java内存模型
第3章 Java内存模型3.1 Java内存模型的基础3.1.1 并发编程模型的两个关键问题线程之间如何通信及线程之间如何同步通信是指线程之间以何种机制来交换信息,通信机制有两种共享内存:在共享内存的并发模型里,线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信消息传递:在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信同步是指程序中用于控制不同线程间操作发生相对顺序的机制在共享内存的并发模型里,同步是显式进行的。程序员必须显式指定某
2021-03-02 18:11:11
93
原创 第2章 Java并发机制的底层实现原理
第2章 Java并发机制的底层实现原理Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终转化为汇编指令在CPU上执行2.1 volatile的应用volatile是轻量级的synchronized,在多处理器开发中保证共享变量的“可见性”即当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值volatile不会引起线程上下文切换和调度1.volatile的定义与实现原理如果一个字段被声明成volatile,Java线程内存模型确保
2021-03-02 17:55:20
81
2
原创 第1章 并发编程的挑战
第1章 并发编程的挑战并发编程的目的是为了让程序运行的更快,但并不是启动更多的线程就能让程序最大限度地并发执行运行中会遇到很多问题,如上下文切换、死锁以及受限于硬件和软件的资源限制等1.1 上下文切换即使是单核处理器也支持多线程执行代码,CPU是通过给每个线程分配CPU时间片来实现多线程的时间片是CPU分配给各个线程的时间,时间片非常短,一般是几十毫秒CPU是通过不停的切换线程执行,因此感觉是多个线程在同时进行CPU通过时间片分配算法来循环执行任务当任务执行一个时间片后会切换到下
2021-03-02 11:14:44
125
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人