自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 收藏
  • 关注

原创 [操作系统OS]第十章:文件

[操作系统OS]第十章:文件

2023-08-06 17:31:41 337

原创 [操作系统OS]第九章:信号量和管程

[操作系统OS]第九章:信号量和管程

2023-07-27 17:35:48 311

原创 [操作系统OS]第八章:同步

[操作系统OS]第八章:同步

2023-07-20 18:20:22 223

原创 [操作系统OS]第七章:CPU调度

[操作系统OS]第七章:CPU调度

2023-07-19 00:21:11 1313

原创 [操作系统OS]第六章: 进程和线程

[操作系统OS]第六章__进程和线程

2023-07-13 23:30:45 157

原创 [操作系统OS]第五章:页面置换算法

[操作系统OS]第五章:页面置换算法

2023-07-04 23:05:14 821

原创 [操作系统OS]第四章:虚拟内存

第四章:虚拟内存

2023-06-29 23:56:23 495

原创 [操作系统OS]第三章:非连续内存分配

非连续内存分配

2023-06-29 00:15:40 206

原创 [操作系统OS]第二章 操作系统如何管理物理空间

操作系统如何管理物理空间

2023-06-28 00:01:33 129

原创 [操作系统OS]第一章:操作系统启动、中断、异常和系统调用

操作系统启动、中断、异常和系统调用

2023-06-27 01:06:58 216

原创 Elastic_Search 实现索引按周期自动创建

三种方法实现Elastic_Search索引按周期自动创建

2023-05-16 00:27:55 4712

原创 总结篇-最全面的G1YGC源码流程梳理及技术细节剖析

一文搞懂,用三万五千字根据书籍及大佬博客总结出的G1YGC实现流程及技术细节剖析

2022-12-14 10:00:00 1164 3

原创 G1的Refine线程

G1的Refine线程

2022-10-09 11:14:38 363

原创 G1垃圾回收器学习笔记-对象分配

对象分配

2022-09-18 15:14:04 338

原创 G1垃圾回收器学习笔记

G1垃圾回收器学习笔记

2022-09-15 16:15:12 1032

原创 Netty源码分析-EventLoop(下)

Nio空轮询bug在哪里体现,并如何解决?在NioEventLoop中,run方法中是一个死循环,所以需要通过调用selector来进行阻塞。如果这个bug发生了,即使没有超时,也会不断进行循环,导致cpu占用率会到达100%。@Overrideprotected void run() { int selectCnt = 0; ... for(;;){ ... // 可能发生空轮询,无法阻塞NIO线程 strategy = selec

2022-02-28 17:46:13 407 1

原创 【踩坑记录】关于jar包找不到resources目录下文件的异常

问题描述在项目中,使用到了resources文件下的数据文件,使用的是File方式: // ResourceUtils.CLASSPATH_URL_PREFIX 值为:"classpath:" // cityProperties.getPath(); 为要使用的文件地址 String path = ResourceUtils.CLASSPATH_URL_PREFIX + cityProperties.getPath(); File citys = ResourceUtils.getFile

2022-02-24 17:21:32 1407

原创 Netty源码分析-EventLoop(上)

前言由于整个NioEventLoop类过大,其中还有很多从父类继承的方法。所以在这里通过以问题驱动的方式,对重要部分进行逐步分析。组成部分Selectorprivate Selector selector;private Selector unwrappedSelector;线程在父类SingleThreadEventLoop的父类SingleThreadEventExecutor中:private volatile Thread thread; // EventLoop用来执行

2022-02-16 13:29:01 433

原创 Netty源码分析-启动流程

原生NIO启动流程// netty 中使用 NioEventLoopGroup (简称 nio boss 线程)来封装线程和 selectorSelector selector = Selector.open(); // 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 configNioServerSocketChannel attachment = new NioServerSocketChannel();// 创建 Nio

2022-02-11 14:41:29 326 1

原创 BIO NIO AIO

BIO NIO AIOBIO传统的同步阻塞式I/O模型。通常由一个Acceptor线程负责监听客户端的连接,接受到客户端的连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回给客户端。线程销毁,也就是典型的一请求一应答通信模型。BIO读写是面向流操作的。BIO流是单向的,一个流必须是InputStream或OutputString的子类。最大的问题就在于缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问量呈1:1的正比关系,由于线程是java虚拟

2022-01-13 00:41:32 162

原创 Linux 网络I/O模型

Linux 网络I/O模型1. 阻塞IO模型最常用的I/O模型,缺省情形下,所有文件操作都是阻塞的。进程空间调用recvfrom函数,直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间,进程会被阻塞一直等待。2. 非阻塞IO模型recvfrom函数当发现内核缓冲区没有数据时,直接返回一个EWOULDBLOCK错误,一般通过轮询检查这个状态,看内核是否有数据到来。3. IO复用模型fd:文件描述符。一个文件的读写操作会调用内核提供的系统命令,返回一个fdsocketf

2022-01-11 23:16:35 1105

原创 LinkedHashMap实现LRU算法--高频面试题

LinkedHashMap实现LRU算法–高频面试题至于LRU算法是什么,相信大家都已经有所了解了,那么在这里就不作描述了。一、什么是LinkedHashMap?public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>不难从源码中看出,实现了Map接口,是HashMap的子类。LinkedHashMap 相对于 HashMap 的源码比,是很简单的。它继承了

2022-01-09 23:32:16 696

原创 Mybatis 学习笔记

Mybatis-9.28环境:JDK1.8Mysql 5.7maven 3.6.1IDEA回顾:JDBCMysqlJava基础MavenJunitSSM框架:配置文件的。 最好的方式:看官网文档;1、简介1.1、什么是MybatisMyBatis 是一款优秀的持久层框架它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接

2021-11-09 21:08:47 200

原创 并发编程从零开始(十七)-ForkJoinPool(终章)

并发编程从零开始(十七)-ForkJoinPool(终章)22 ForkJoinTask的fork/join如果局部队列、全局中的任务全部是相互独立的,就很简单了。但问题是,对于分治算法来说,分解出来的一个个任务并不是独立的,而是相互依赖,一个任务的完成要依赖另一个前置任务的完成。这种依赖关系是通过ForkJoinTask中的join()来体现的。且看前面的代码:线程在执行当前ForkJoinTask的时候,产生了left、right 两个子Task。fork是指把这两个子Task放入队列里面。

2021-11-04 11:32:40 119

原创 并发编程从零开始(十六)-ForkJoinPool

并发编程从零开始(十六)-ForkJoinPool第四部分:ForkJoinPool15 ForkJoinPool用法ForkJoinPool就是JDK7提供的一种“分治算法”的多线程并行计算框架。Fork意为分叉,Join意为合并,一分一合,相互配合,形成分治算法。此外,也可以将ForkJoinPool看作一个单机版的Map/Reduce,多个线程并行计算。相比于ThreadPoolExecutor,ForkJoinPool可以更好地实现计算的负载均衡,提高资源利用率。假设有5个任务,在Thre

2021-11-03 23:19:05 132

原创 并发编程从零开始(十五)-CompletableFuture

并发编程从零开始(十五)-CompletableFuture14 CompletableFuture 用法从JDK 8开始,在Concurrent包中提供了一个强大的异步编程工具CompletableFuture。在JDK8之前,异步编程可以通过线程池和Future来实现,但功能还不够强大。CompletableFuture实现了Future接口,所以它也具有Future的特性:调用get()方法会阻塞在那,直到结果返回。另外1个线程调用complete方法完成该Future,则所有阻塞在get(

2021-11-03 00:30:19 175

原创 并发编程从零开始(十四)-Executors工具类

并发编程从零开始(十四)-Executors工具类12 Executors工具类concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池12.1 四种对比单线程的线程池:固定数目线程的线程池:每接收一个请求,就创建一个线程来执行:单线程具有周期调度功能的线程池:多线程,有调度功能的线程池:12.2 最佳实践不同类型的线程池,其实都是由前面的几个关键配置参数配置而成的。在《阿里巴巴Java开发手册》中,明确禁止使用Executors创建线程池,

2021-11-02 19:02:26 133

原创 并发编程从零开始(十三)-线程池

并发编程从零开始(十三)-线程池第三部分:线程池与Future9 线程池的实现原理下图所示为线程池的实现原理:调用方不断地向线程池中提交任务;线程池中有一组线程,不断地从队列中取任务,这是一个典型的生产者—消费者模型。要实现这样一个线程池,有几个问题需要考虑:队列设置多长?如果是无界的,调用方不断地往队列中放任务,可能导致内存耗尽。如果是有界的,当队列满了之后,调用方如何处理?线程池中的线程个数是固定的,还是动态变化的?每次提交新任务,是放入队列?还是开新线程?当没有任务的

2021-11-02 16:07:28 171

原创 并发编程从零开始(十二)-Lock与Condition

并发编程从零开始(十二)-Lock与Condition8 Lock与Condition8.1 互斥锁8.1.1 锁的可重入性“可重入锁”是指当一个线程调用 object.lock()获取到锁,进入临界区后,再次调用object.lock(),仍然可以获取到该锁。显然,通常的锁都要设计成可重入的,否则就会发生死锁。synchronized关键字,就是可重入锁。在一个synchronized方法method1()里面调用另外一个synchronized方法method2()。如果synchronize

2021-10-31 15:11:53 216

原创 并发编程从零开始(十一)-Atomic类

并发编程从零开始(十一)-Atomic类7 Atomic类7.1 AtomicInteger和AtomicLong如下面代码所示,对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加synchronized关键字。但有了Concurrent包的Atomic相关的类之后,synchronized关键字可以用AtomicInteger代替,其性能更好,对应的代码变为:AtomicInteger的 getAndIncrement() 方法和 getAndDecrement() 方法都调用了一个

2021-10-31 00:51:39 190

原创 并发编程从零开始(十)-同步工具类

并发编程从零开始(十)-同步工具类6 同步工具类6.1 SemaphoreSemaphore也就是信号量,提供了资源数量的并发访问控制,其使用代码很简单,如下所示:有参方法tryAcquire(long timeout, TimeUnit unit)的作用是在指定的时间内尝试地获取1个许可,如果获取不到就返回false。可以使用Semphore实现一个简易的抢座:public class Main { public static void main(String[] args) th

2021-10-28 23:44:21 105

原创 并发编程从零开始(九)-ConcurrentSkipListMap&Set

并发编程从零开始(九)-ConcurrentSkipListMap&SetCAS知识点补充:我们都知道在使用 CAS 也就是使用 compareAndSet(current,next)方法进行无锁自加或者更换栈的表头之类的问题时会出现ABA问题。Java中使用 AtomicStampedReference 来解决 CAS 中的ABA问题,它不再像一般原子类中的 compareAndSet 方法一样只比较内存中的值也当前值是否相等,而且先比较引用是否相等,然后比较值是否相等,此外还会比对版本戳是

2021-10-28 12:31:32 87

原创 并发编程从零开始(八)-ConcurrentHashMap

并发编程从零开始(八)-ConcurrentHashMap5.5 ConcurrentHashMapHashMap通常的实现方式是“数组+链表”,这种方式被称为“拉链法”。ConcurrentHashMap在这个基本原理之上进行了各种优化。首先是所有数据都放在一个大的HashMap中;其次是引入了红黑树。其原理如下图所示:如果头节点是Node类型,则尾随它的就是一个普通的链表;如果头节点是TreeNode类型,它的后面就是一颗红黑树,TreeNode是Node的子类。链表和红黑树之间可以相互转

2021-10-27 18:27:41 185

原创 并发编程从零开始(七)-ConcurrentLinkedQueue

并发编程从零开始(七)-ConcurrentLinkedQueue5.4 ConcurrentLinkedQueue/DequeAQS内部的阻塞队列实现原理:基于双向链表,通过对head/tail进行CAS操作,实现入队和出队。(队列中存放的是线程)ConcurrentLinkedQueue 的实现原理和AQS 内部的阻塞队列类似:同样是基于 CAS,同样是通过head/tail指针记录队列头部和尾部,但还是有稍许差别。首先,它是一个单向链表,定义如下:其次,在AQS的阻塞队列中,每次入队后,t

2021-10-27 16:51:03 143

原创 并发编程从零开始(六)-BlockingDeque+CopyOnWrite

并发编程从零开始(六)-BlockingDeque+CopyOnWrite5.2 BlockingDequeBlockingDeque定义了一个阻塞的双端队列接口:该接口继承了BlockingQueue接口,同时增加了对应的双端队列操作接口。该接口只有一个实现,就是LinkedBlockingDeque,其核心数据结构如下所示,是一个双向链表。对应的实现原理,和LinkedBlockingQueue基本一样,只是LinkedBlockingQueue是单向链表,而LinkedBlockingDe

2021-10-27 15:21:41 76

原创 并发编程从零开始(五)-BlockingQueue

并发编程从零开始(五)-BlockingQueue第二部分:JUC5 并发容器5.1 BlockingQueue在所有的并发容器中,BlockingQueue是最常见的一种。BlockingQueue是一个带阻塞功能的队列,当入队列时,若队列已满,则阻塞调用者;当出队列时,若队列为空,则阻塞调用者。在Concurrent包中,BlockingQueue是一个接口,有许多个不同的实现类,如图所示。该接口的定义如下:该接口和JDK集合包中的Queue接口是兼容的,同时在其基础上增加了阻塞功能。

2021-10-27 14:26:00 120

原创 并发编程从零开始(四)-volatile/final

并发编程从零开始(四)4 JMM内存模型4.1 JMM与happen-before4.1.1 为什么会存在内存可见性问题下图为x86架构下CPU缓存的布局,即在一个CPU 4核下,L1、L2、L3三级缓存与主内存的布局。每个核上面有L1、L2缓存,L3缓存为所有核共用。因为存在CPU缓存一致性协议,例如MESI,多个CPU核心之间缓存不会出现不同步的问题,不会有“内存可见性”问题。缓存一致性协议对性能有很大损耗,为了解决这个问题,又进行了各种优化。例如,在计算单元和L1之间加了Store Bu

2021-10-27 09:37:53 178

原创 并发编程从零开始(三)

并发编程从零开始(三)3 并发的问题3.1 数据竞争如果有两个或者多个任务在临界段之外对一个共享变量进行写入操作,也就是说没有使用任何同步机制,那么应用程序可能存在数据竞争(也叫做竞争条件)。在这些情况下,应用程序的最终结果可能取决于任务的执行顺序。假设有两个不同的任务执行了同一个modify方法。由于任务中语句的执行顺序不同,最终结果也会不同。modify方法不是原子的, ConcurrentDemo 也不是线程安全的。3.2 死锁当两个(或多个)任务正在等待必须由另一线程释放的某个共享

2021-10-26 15:13:47 77

原创 并发编程从零开始(二)

并发编程从零开始(二)2. 并发核心概念2.1 并发与并行在单个处理器上采用单核执行多个任务即为并发。在这种情况下,操作系统的任务调度程序会很快从一个任务切换到另一个任务,因此看起来所有的任务都是同时运行的。同一时间内在不同计算机、处理器或处理器核心上同时运行多个任务,就是所谓的“并行”。另一个关于并发的定义是,在系统上同时运行多个任务(不同的任务)就是并发。而另一个关于并行的定义是:同时在某个数据集的不同部分上运行同一任务的不同实例就是并行。关于并行的最后一个定义是,系统中同时运行了多个任务。

2021-10-26 13:39:09 71

原创 并发编程从零开始(一)

并发编程从零开始(一)简介java是一个支持多线程的开发语言。多线程可以在包含多个CPU核心的机器上同时处理多个不同的任务,优化资源的使用率,提升程序的效率。在一些对性能要求比较高场合,多线程是java程序调优的重要方面。Java并发编程主要涉及以下几个部分:并发编程三要素:原子性:即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)可见性:当多个线程访问同一个变量时,

2021-10-25 19:45:45 134

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除