自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 【杂谈】再看生产-消费模式

生产者和消费者之间为什么隔着一个队列?首先,生产者与消费者由于速度的不一致,所以需要一个空间用于缓冲。这可以将生产者与消费者解耦,生产者产出数据的时候,不需要把数据交到消费者手上才行,只要把数据丢入缓冲区就好。这样就可以各做各的。为什么缓冲区是一个队列?通常情况下,这个缓冲区的数据结构是一个有序的队列。实际上如果对处理顺序没啥要求,其实也不一定要用队列。插空都可以。为什么...

2019-09-09 21:39:00 201

转载 【杂谈】Hash表与平衡树

hash表与平衡树查询数据的时间复杂度是多少?hash表为O(1),平衡树为O(logn)这个时间复杂度是如何得出的?时间复杂度是按照最糟糕的情况来的。但即使是最糟糕的情况,hash表也只需要计算一次,就可以定位到数据(对于常见的实现,实际上是定位到桶,然后在桶内遍历)。而对于平衡树,例如AVL树,由于数据是有序的,比对的最大次数就是树的深度。明明hash表查询更快,数据...

2019-07-27 10:59:00 242

转载 【杂谈】如何对Redis进行原子操作

什么时候需要进行需要原子操作?很常见的例子,就是利用Redis实现分布式锁。实现锁需要哪些条件?我们知道要实现锁,就需要一个改变锁状态的方法。这个方法能原子地对锁的状态进行检查并修改。如果修改成功,则意味着获得了锁。对于硬件,它提供的就是test-and-set,compare-and-swap等原语。Redis有没有提供类似的原语呢?有的。Redis有提供setnx...

2019-07-26 15:49:00 1211

转载 【杂谈】从底层看锁的实现2

前言我的上一篇博客的案例中,请求锁的线程如果发现锁已经被其他线程占用,它是通过自旋的方式来等待的,也就是不断地尝试直到成功。本篇就讨论一下另一种方式,那就是挂起以等待唤醒。注:相关代码都来自《Operating System: Three Easy Pieces》这本书。自旋哪里不好?先说明一下,自旋也有它的好处,不过这里先不讲,我们先讲它可能存在哪些问题。我们考虑一...

2019-06-30 10:56:00 179

转载 【杂谈】从底层看锁的实现

以下内容针对互斥锁。为什么需要锁?锁代表着对临界区的访问权限。只有获得锁的操作对象,才能进入临界区。锁的本质是什么?锁的本质是一个数据结构(或者说是一个对象),这个对象内保留着描述锁所需要的必要信息。如当前锁是否已被占用,被哪个线程占用。而锁的一些工具,函数库,实际上就是对一个锁对象的信息进行变更。上锁操作 => 尝试对锁对象的信息进行修改,如果修改成功...

2019-06-17 16:54:00 192

转载 【杂谈】高速缓存一致性与可见性

这里的缓存指的是什么?到处都可以有缓存,磁盘中的数据提前加载到内存中就是常见的“缓存”,而我们这里要说的是内存中的数据提前加载到CPU的缓存。每个CPU都有一定的缓存空间。什么样的数据会存入缓存?编译器或CPU可以明确知晓的,可能被经常访问的数据。例如一个在循环体中的变量,因为这个变量在循环结束前需要经常访问,如果每次都从主存中拿,那就太慢了。缓存一致,是跟谁一致?是...

2019-05-11 15:55:00 315

转载 【杂谈】操作系统如何有效地掌控CPU

操作系统的本质操作系统本质上也是一个进程,它与其他用户进程共享CPU。与普通进程不同的是,它具有硬件的所有访问权限。而用户进程默认对硬件是没有任何访问权限的,它只能通过系统调用,委托操作系统来完成这些操作。问题当操作系统在创建完一个进程后,会将CPU的控制权交给这个新创建的进程。上下文切换,大家应该都知道。操作系统要做的就是停止一个进程,然后再启动另一个进程。很简单是吧,那么...

2019-05-01 12:02:00 274

转载 【API知识】一种你可能没见过的Controller形式

前言这里分享一下我遇到的一个挺有意思的Controller形式,内容涉及@RequestMapping注解的原理。实际案例一、基本描述项目甲中有多个模块,其中就有模块A和B。(这里的模块指的是Maven的多模块子项目),项目乙、丙、丁可以引用模块A来访问独立部署的模块B模块A => 关于与模块B通信的协议定义模块B => 可以独立部署的项目其中...

2019-04-20 16:19:00 559

转载 【详解】Tomcat是如何监控并删除超时Session的?

前言偶然发现Tomcat会话时间的半小时,并不是说“会话创建后只有半小时的有效使用时间”,而是说“会话空闲半小时后会被删除”。索性就翻了一下源码。做了一番整理。注:空闲时间,指的是同一个会话两次请求之间的间隔时间Session相关类图HttpSession就是大家Servlet层可以直接使用的Session.Session是Tomcat内部使用的接口,可以做一...

2019-04-14 17:03:00 282

转载 【API知识】RestTemplate的使用

前言  在某种情况下,后台服务可能需要访问另一台服务器的REST接口。以前估计不少人用的都是HttpRequest类来着,结合Paser解析JSON格式的Body。现在Spring Boot的Web Starter就自带了RestTemplate,直接用它的就好了。最好不要再往项目里导新的依赖。这里做了点整理,分享出来。发简单的请求一、GET请求案例如下:Rest...

2019-04-04 21:59:00 190

转载 【杂谈】Tomcat 之 Lifecycle接口

前言  此篇随笔记录《How Tomcat works》中关于Lifecycle接口的相关总结Lifecycle接口的主要目的核心:统一。已知Tomcat的卡特琳娜(Catalina)由许多组件构成。当Catalina启动的时候,这些组件也要跟着一起启动,并且当Catalina关闭的时候,这些组件也要同时关闭,并且要进行必要的清理操作,释放资源。例如,当容器关闭的时候,需...

2019-04-01 22:49:00 134

转载 【杂谈】FilterChain相关知识整理

前言  做后台的,Filter肯定没少配置,但是知晓其原理的可能不多。在这之前我也不懂,但这并不影响业务开发,同时也有其他的知识要学,所以一直就没看。这阵子有点闲,刚好在看《How Tomcat Works》的PipeLine相关内容。索性好好梳理一下FilterChain相关的知识。类图FilterChain的作用顾名思义,FilterChain就是一条过滤链。其中...

2019-03-21 21:22:00 162

转载 【杂谈】Remember-Me的实现

前言  此篇随笔记录了Remember-Me实现过程中出现的问题和解决方案,以及相关的思考。正文1. RememberMe是什么?RememberMe意为记住我,对应登录界面的那个勾选项。另一种说法,就是自动登录。2. 那什么又是自动登录呢?我们知道Tomcat或者其他Servlet容器的会话都是有时限的,比如Tomcat的会话时间为30分钟,如果30分钟内没有访...

2019-03-17 17:30:00 246

转载 【杂谈】没有公网IP的电脑如何与外部通信

前言  前几天突然想到的问题,自己先猜测推理了一番,最后在谢希仁版《计算机网络》找到了权威的解答。这里记录一下自己的思考过程。网站是如何找到我们的?我们知道,互联网中的两台电脑要进行通信,就必须彼此知晓对方的位置。IP地址就是对电脑地址的一种表示。其中公网IP具有全网唯一性,可以唯一标识一台电脑,故可以依此进行寻址并通信。但是,学生使用校园网,电脑没有公网IP,只有局域网...

2019-02-21 21:13:00 1560

转载 【杂谈】tocmat是何时写回响应数据报的

疑问的产生这个疑问是我在写文件下载的时候产生的,我是用HttpServletResponse获取到Outputstream,然后利用OutputStream直接写数据的。当时我就想这个OutputStream是不是就是对应的Socket连接的OutputStream。即是不是的程序在用stream写的时候,数据也同时在发?Response的OutputStream把数据写到哪去?...

2019-02-13 18:31:00 104

转载 【杂谈】一个简易的静态网页服务器

前言  上一篇随笔【杂谈】一个回车下去,浏览器做了什么?讲了浏览器的处理,这里再用一个例子讲解一下,也不算讲解,算是梳理一下服务端处理浏览器请求的过程。当然实际过程要比这复杂多了。下文的例子,其实就是《How Tomcat Works》这本书的第一个例子,感兴趣的可以去看这本书。不过书上的例子有问题,我下文中会提到。注:此项目不需要用tomcat,纯Java底层代码写就可以了。...

2019-02-07 21:55:00 134

转载 【杂谈】一个回车下去,浏览器做了什么?

前言  在使用PostMan之前,自己测试Rest接口都是直接在浏览器地址栏输入URL来测试的,但是这种方法发出的请求都是Get,如果要发送POST请求只能用ajax等编程方式。有了PostMan就方便多了。某一天在输URL的时候,突然想看看浏览器到底做了什么,于是就有了下面这些内容。概述以下讲述的是一个请求静态网页文件的例子,该例子有以下几个过程:1.在浏览器地址栏输入...

2019-02-06 16:51:00 115

转载 【详解】换一个角度看Socket的数据读写

前言  以前对IO、NIO还算了解,也写过Netty的项目。但是对底层的数据传递不是很了解,一直存有这方面的疑惑。但是由于有其他事情就被打断了。前阵子因为想要了解volatile关键字的原理,学习了下JMM(Java内存模型),了解到对象数据是如何存储的。后来又想知道Tomcat是如何传递Http报文的,源码翻着翻着就到了Socket,想来Socket还有些东西没学清楚,就干脆乘着兴...

2019-02-03 21:36:00 301

转载 【详解】Spring Security 之 SecurityContext

前言  本文主要整理一下SecurityContext的存储方式。SecurityContext接口顾名思义,安全上下文。即存储认证授权的相关信息,实际上就是存储"当前用户"账号信息和相关权限。这个接口只有两个方法,Authentication对象的getter、setter。package org.springframework.security.core.cont...

2019-01-20 15:20:00 758

转载 【详解】WebSocket相关知识整理

前言  记得大概半年前就产生了疑惑,即后台如何主动向前端推送数据。问了下专业老师,知道了原来有一个叫WebSocket的技术可以用于推送数据。于是,当时我就找了个教程,用的是Spring WebSocket。照着敲了一遍,也就搭起来了,依葫芦画瓢而已。当时有其他东西要学,也没有相关的需求,就没再接触过。前阵子刚好要用这个框架,但是API早忘了,就又搜了一遍,发现网上各种各样的案例都有...

2018-12-31 11:47:00 229

转载 【杂谈】Spring Boot 默认支持的并发量

Spring Boot应用支持的最大并发量是多少?Spring Boot 能支持的最大并发量主要看其对Tomcat的设置,可以在配置文件中对其进行更改。当在配置文件中敲出max后提示值就是它的默认值。我们可以看到默认设置中,Tomcat的最大线程数是200,最大连接数是10000。并发量指的是连接数,还是线程数?当然是连接数。200个线程如何处理10000条连接?...

2018-12-30 16:33:00 8095

转载 【杂谈】Starter Template

Spring Boot 项目与普通项目在包管理上的差别主要差别就是,Spring Boot在包管理上用了starter template,你应该经常看到xxx-starter这类的dependency。实际上就是一个整合包。例如一个spring-boot-web-starter,就包含了所有web应用要用到的基础包。control点进去看就知道了,实际上就是引入了内置的tomcat + ...

2018-12-22 21:25:00 205

转载 【API知识】ElementUI一些问题的解决方案

前言  本人并不是前端开发人员,不过前端的界面和交互也没少写。以下整理一下我在使用elementUI过程中遇到的问题和对应的解决方案。正文1.表格字段过长省略  elmentUI的table-column有提供属性 show-overflow-tooltip 只要在对应的字段上设置为true,则文本超出部分就会用省略号替代,并且鼠标移至其上时,可查看完整信息。2.如何...

2018-12-22 20:49:00 359

转载 【API知识】类型转换工具ConvertUtils引发的思考

前言  在读取Excel文件数据,有时候不可避免地需要把获取到的字符串转型为基本类型的对象。以前都是自己写转换,难度也不大。后来听说,有可以直接用的轮子——Apache 的commons-beanutils这个包,有提供ConvertUtils。以下我的相关记录。我要的异常呢?  听说有可以用的轮子,第一反应,肯定是拿来先跑几个测试案例。这东西使用起来也很简单,参数就是源字符...

2018-12-14 22:16:00 336

转载 【API知识】MongoTemplate非映射方式操作Document

前言  我是MongoDB小白,刚开始学。不过,我猜大多数使用MongoDB的,都是采用映射方式处理的,即需要有定义好的用于映射的实体类。但是这样的话,如果表的结构在未来可能频繁变动,增删字段,甚至添加新的数据表。那么这种方式就不太好用了。这时候就需要用非映射的方式处理。映射方式操作Document  这种方式最常见,一般就是预定义一些映射的实体类,然后打上@Ducument...

2018-12-09 21:12:00 1023

转载 【杂谈】线程中断——Interrupt

前言  以前有一个错误的认识,以为中断操作都会抛出异常,后来才发现并不是这样,所以今天就来做一个关于中断的总结。如何关闭线程  已被弃用的Stop方法    早期,Thread类中有一个stop方法,用于强行关闭一个线程。但是后来发现此操作并不安全,强行关闭可能导致一致性问题。故stop方法已被官方弃用。具体原因请看Why are Thread.stop, Thread....

2018-11-28 11:34:00 174

转载 【杂谈】对IO与NIO的认识

IO流与NIO块的数据缓存  Java的IO是面向流设计的,通常我们通过IO流读取数据,只能指定读取数据的大小,而不能选择数据读取的起始位置。数据就像流水一样,流过我们的应用,一旦流过就无法回头。除非我们的代码对所读取的数据进行缓存,否则就再也见不到它了(针对此次流操作)。  比如,我们创建一个byte[]数组来进行数据缓存,稍后可根据需要再次读取数组内的数据。但是有一点不方便...

2018-11-27 17:26:00 62

转载 【杂谈】对RMI(Remote Method Invoke)的认识

前言  对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了。当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白。现在对网络和I/O有了一定了解,理解起来也比较顺畅了。以下,是我对RMI的认识。RMI的相关概念  "Incomputing, theJava Remote Method Invocation...

2018-11-15 10:12:00 153

转载 【杂谈】对CopyOnWriteArrayList的认识

前言  之前看《Java并发编程》这本书的时候,有看到这个,只记得"读多写少"、"写入时复制"。书中没有过多讲述,只是一笔带过(不过现在回头看,发现讲的都是精髓。老外的书大多重理论,喜欢花大篇幅讲概念,这点我非常喜欢)记得当时是觉得可能有点难,先跳过了,结果就忘记回头看了。今天突然想起来,就看了一下,整理一点东西。非线程安全的ArrayList我们知道原来util包中的Arr...

2018-11-12 21:57:00 183

转载 【杂谈】Java I/O的底层实现

前言  Java I/O功能封装的很好,使用起来很方便,就是刚开始学的时候,如果不了解装饰器模式,会被他繁多的类给吓到。用多了也就习惯了,而且现在有很多实用的封装良好的实用类,可直接读写整个文件。开发者不知道底层实现细节,也可以灵活使用,这是封装的一大优点。但是,作为一名软件开发人员,对其所使用的代码不能仅仅停留在熟悉功能特性上,最好对其实现原理也要有一定了解。注:本文引用了部分...

2018-11-08 23:31:00 124

转载 揭开Future的神秘面纱——结果获取

前言  在前面的两篇博文中,已经介绍利用FutureTask任务的执行流程,以及利用其实现的cancel方法取消任务的情况。本篇就来介绍下,线程任务的结果获取。系列目录揭开Future的神秘面纱——任务取消揭开Future的神秘面纱——任务执行揭开Future的神秘面纱——结果获取利用get方法获取程序运行结果  我们知道利用Future接口的最重要的...

2018-11-04 22:54:00 935

转载 揭开Future的神秘面纱——任务执行

前言  此文承接之前的博文 解开Future的神秘面纱之取消任务补充一些任务执行的一些细节,并从全局介绍程序的运行情况。系列目录揭开Future的神秘面纱——任务取消揭开Future的神秘面纱——任务执行揭开Future的神秘面纱——结果获取任务的提交与执行任务提交到执行的流程  前文我们已经了解到一些Future的实现细节,这里...

2018-11-03 22:16:00 73

转载 【详解】ThreadPoolExecutor源码阅读(三)

系列目录【详解】ThreadPoolExecutor源码阅读(一)【详解】ThreadPoolExecutor源码阅读(二)【详解】ThreadPoolExecutor源码阅读(三)线程数量的维护线程池的大小有两个重要的参数,一个是corePoolSize(核心线程池大小),另一个是maximumPoolSize(最大线程大小)。线程池主要根据这两个参数对线程...

2018-11-02 18:29:00 92

转载 【详解】ThreadPoolExecutor源码阅读(二)

系列目录【详解】ThreadPoolExecutor源码阅读(一)【详解】ThreadPoolExecutor源码阅读(二)【详解】ThreadPoolExecutor源码阅读(三)AQS在Worker中的应用——标识空闲or非空闲工作线程我对这个上锁一直搞不懂,虽然有注释说是允许中断啥的,但是还是一头雾水,就打算直接看代码分析。第一眼看到这个lock的时候,...

2018-11-01 20:47:00 79

转载 【详解】ThreadPoolExecutor源码阅读(一)

系列目录【详解】ThreadPoolExecutor源码阅读(一)【详解】ThreadPoolExecutor源码阅读(二)【详解】ThreadPoolExecutor源码阅读(三)工作原理简介  ThreadPoolExecutor会创建一组工作线程,每当一个工作线程完成其任务的时候,会向任务队列获取新的任务执行。如果任务队列为空,获取任务的线程将被阻塞...

2018-11-01 20:00:00 89

转载 【胡思乱想】JNI与线程池的维护

JNI中,C/C++代码里创建的资源不由Java GC处理,故这里的资源必须由C/C++代码明确释放。在JNI中,C/C++回调Java的方法是调用一个CallXXMethod函数来实现的,如果回调的方法结束,C/C++执行下一行代码。故猜测,由C/C++创建的OS线程应该会在运行完run方法后释放,不然好像也没有其他合适的时间点来对线程进行释放了。因为按照语义的话,既然线程的任务已...

2018-10-28 19:07:00 110

转载 【胡思乱想】命令模式中,命令对象如何解耦Invoker和Receiver

首先,我们得清楚为何要解耦?  耦合的坏处就是,牵一发而动全身,比如,当我更改了类A或其子类的时候,类B也要进行修改。这里,解除耦合,就意味着,即使你Receiver怎么改,添加了多少,删除了多少。我Invoker都不需要做什么改动。有人会说,这不是很好办吗,我定义一个接口,每个Receiver都实现这个接口,然后我Invoker针对这个接口编程不就好了?  这样有两个...

2018-10-28 03:00:00 237

转载 【胡思乱想】命令模式 与 Thread Runnable

实现线程任务有两种方式,一种是创建Runnable/Callable对象,传递给Thread。另一种是子类重写Thread的run方法。我觉得前一种像极了命令模式,或者说应该是命令模式的一个使用案例。相似如下:(1)Runnable 接口,只定义一个"()V"(表示无参,返回值为void)的方法run。创建Runnable对象的方式也有很多,这里就提一种,那就是定义一个类A实...

2018-10-28 02:22:00 193

转载 【详解】JNI (Java Native Interface) (四)

案例四:回调实例方法与静态方法描述:此案例将通过Java调用的C语言代码回调Java方法。要想调用实例对象的方法,需要进行以下步骤:1. 通过对象实例,获取到对象类的引用 => GetObjectClass()2. 通过类引用,获取到方法ID => GetMethodID() 需要提供方法名,和方法签名。也就是需要这两个信息来标识确定一个方法。...

2018-10-26 16:56:00 83

转载 【详解】JNI (Java Native Interface) (三)

案例三:C代码访问Java对象的实例变量  获取对象的实例变量的步骤:  1. 通过GetObjectClass()方法获得此对象的类引用  2. 通过类引用的GetFieldID()方法获得实例变量的Field ID.    你需要提供变量名,字段类型描述符对于Java 类, 字段描述符格式为 "L<类全称>;" 类全称中,点"."用 ...

2018-10-26 15:33:00 77

空空如也

空空如也

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

TA关注的人

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