java基础
文章平均质量分 85
你的boy_Z
timianer
展开
-
线程数确定
线程数确定前言这篇文章主要介绍系统中线程数量怎么确定解决方案根据线程计算时间和等待时间Ncpu : 服务器cpu核心数量Ucpu: 服务器cpu的利用率W: 线程的等待时间(IO操作)C: 线程的计算时间Nthread : 系统理想化线程数量Nthread = Ncpu * Ucpu * (1+W/C);常规方案2*Ncpu 我觉得这里是认为线程等待时间等于线程计算时间TPS方案tps(transcationsPerSecond):也就是事务数/秒。它是软件测试结果的测量单位。一原创 2021-02-20 22:37:46 · 420 阅读 · 0 评论 -
IO学习
IO学习之IO模型前言五种IO模型包括:阻塞IO、非阻塞IO、信号驱动IO、IO多路转接、异步IO。其中,前四个被称为同步IO。一 、阻塞IO由名字可以得知,该io操作是阻塞的。阻塞这个概念我们在锁的时候接触过,当一个线程获取不到锁的时候就会阻塞。IO一样,当前线程去申请一个阻塞IO,这个是会阻塞该线程,直达请求数据拿到。下面详细说一下流程,一个线程调用高级语言 file获取文件接口(fd:文件描述符)–》系统IO接口–》驱动—》中断–》CPU–》磁盘。 在调用系统接口时,由于我们是用户空间调用原创 2021-02-20 22:36:52 · 301 阅读 · 0 评论 -
LockSupport学习
LockSupport写在前面up在最近研究AQS源码时候发现,其最终使线程阻塞和唤醒的方法是利用了LockSupport.park/unpark方法,up之前还未接触过,所以些这篇文章来研究一下这两个api。源码分析我们先看一下LockSupport的park()方法:/*LockSupport.park*/ public static void park() { UNSAFE.park(false, 0L); }这个方法的作用阻碍当前线程获取cpu时钟(原创 2021-02-08 10:47:13 · 165 阅读 · 0 评论 -
多线程衍生过程
多线程衍生过程一、多线程基础1、进程与线程的概念1.1 进程产生的背景最初的计算机只能接受一些特定的指令,用户每输入一个指令,计算机就做出一个操作。当用户在思考或者输入时,计算机就在等待。这样效率非常低下,在很多时候,计算机都处在等待状态。批处理操作系统后来有了批处理操作系统,把一系列需要操作的指令写下来,形成一个清单,一次性交给计算机。用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁带上。批处理操作系统在一定程度上提高了计算机的效率,但是由原创 2021-02-08 10:05:17 · 239 阅读 · 0 评论 -
ReentrantLock到AQS
ReentrantLock到AQS写在前面上一篇讲了Synchronized的原理,这篇讲一下另一个锁ReentrantLock和它的基石AQS。Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS原创 2021-02-07 18:59:30 · 204 阅读 · 0 评论 -
Synchronized原理
Synchronized原理前言本文针对java互斥锁synchronized关键字的底层原理进行描述。为什么需要锁?锁存在于并发的场景,并发场景存在什么问题? 前提是并发场景存在一个多线程争夺的资源,该资源可以同时被多个线程获取到,但是这样会产生问题。比如 这个资源是一个数字1,现在多个线程的任务都是将这个数字累加。A线程先拿到数字1,这时候累加未结束,B线程又去拿到了A,那么B运行之后数字不是3而是2。这就产生了问题。那么怎么解决? 一 让这个数字的变化再所以线程中共享,也就是可见性,二、保证原创 2021-02-03 20:44:58 · 222 阅读 · 0 评论 -
最全面解析的线程池的实现原理
线程池的实现原理以及业务中的实践一个体面人的技术之旅。一 、写在前面1.1 线程池是什么?线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销(java线程对应操作系统的线程,创建线程需要切换用户状态,和占用内存等资源,而其大部分操作系统都会限制系统中的最大线程数量)、调度线程的开销(涉及到线程挂起和恢复,挂起需要记录线程状态)等等,同时也降低了计算机的整体性能。*用户态和内核态切换的代价*原创 2020-11-30 13:56:10 · 1520 阅读 · 0 评论 -
Jstat -gc 参数说明
Jstat -gc 参数说明Jstat -gc 参数说明Jstat -gc 参数说明S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时原创 2020-10-14 13:54:46 · 10169 阅读 · 0 评论 -
深入了解Java注解
总结:所有的注解都是继承了了Annotation接口,我们通过getAnnotation获取注解时候,是获取了一个通过java动态代理获取的一个代理对象$Proxy1,该代理对象就是我们注解的实现类。 我们知道代理对象的核心是InvocationHandler,$Proxy1的Handler是通过AnnotationInvocationHandler类来实现的,那这个Handler是怎么实现具体要...原创 2020-04-09 13:44:08 · 92 阅读 · 0 评论