自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 同步阻塞与异步非阻塞(简单了解)

1 同步阻塞消息处理假如有这样一个系统功能,客户端提交Event至服务器,服务器接收到客户请求之后开辟线程处理客户请求,经过比较复杂的业务计算后将结果返回给客户端图5-1所示的设计存在几个显著的缺陷,具体如下:同步Event提交,客户端等待时间过长(提交Event时长+接受Event创建thread时长+业务处理时长+返回结果时长)会陷入阻塞,导致二次提交Event耗时过长。由于客户端提交的Event数量不多,导致系统同时受理业务数量有限,也就是系统整体的吞吐量不高。这种一个线程处理一个Eve

2021-03-31 16:29:02 178

原创 程序死锁的原因以及如何诊断

1 程序死锁1.1 交叉锁可导致程序出现死锁线程A持有R1的锁等待获取R2的锁,线程B持有R2的锁等待获取R1的锁(典型的哲学家吃面),这种情况最容易导致程序发生死锁的问题1.2 内存不足当并发请求系统可用内存时,如果此时系统内存不足,则可能会出现死锁的情况。举个例子,两个线程T1和T2,执行某个任务,其中T1已经获取了10MB内存,T2获取了20MB内存,如果每个线程的执行单元都需要30MB的内存,但是剩余可用的内存刚好为20MB,那么两个线程有可能都在等待彼此能够释放内存资源。1.3 一问一

2021-03-31 16:01:13 1300

原创 深入synchronized关键字

文章目录1 线程堆栈分析2 JVM指令分析2.1 Monitorenter2.2 Monitorexit3 使用synchronized需要注意的问题4 This Monitor和Class Monitor的详细介绍4.1 This Monitor4.1.1 验证同步方法的monitor是this的monitor4.1.2 验证一下同步静态方法的monitor是class monitor1 线程堆栈分析synchronized关键字提供了一种互斥机制,也就是说在同一时刻,只能有一个线程访问同步资源,很

2021-03-31 15:18:57 119

原创 06 监测程序

1 探查进程(ps 命令)当程序运行在系统上时,我们称之为进程(process)。想监测这些进程,需要熟悉ps命令的用法。ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许多信息。有数不清的参数,这或许让ps命令成了最难掌握的命令默认情况下,ps命令并不会提供那么多的信息:[admin@iZbp1hld5mqm15c6sdgqfkZ ~]$ ps PID TTY TIME CMD31281 pts/0 00:00:00 bash31304 pts/0

2021-03-31 09:40:53 166 1

原创 多线程之数据同步(初识synchronized关键字)

1 数据不一致问题的引入之前的一个窗口叫号程序:链接地址public class TicketRunnable implements Runnable{ /** * 定义50张门票 */ private final int TICKET_TOTAL = 500; private int index = 1; @Override public void run() { while (index <= TICKET_TO

2021-03-30 17:06:20 160

原创 Thread类API详解(四)-如何关闭一个线程

JDK有一个Deprecated方法stop,但是该方法存在一个问题,JDK官方早已经不推荐使用,其在后面的版本中有可能会被移除,根据官网的描述,该方法在关闭线程时可能不会释放掉monitor的锁,所以强烈建议不要使用该方法结束线程。1 正常关闭线程结束生命周期正常结束。线程运行结束,完成了自己的使命之后,就会正常退出,如果线程中的任务耗时比较短,或者时间可控,那么放任它正常结束就好了。捕获中断信号关闭线程,比如下面这段代码:上面的代码是通过检查线程interrupt的标识来决定是否退出的

2021-03-30 13:50:01 245

原创 Thread的API详细介绍(三)线程的join

1 join方法介绍当前线程等待子线程死亡,才会执行。与sleep一样它也是一个可中断的方法,也就是说,如果有其他线程执行了对当前线程的interrupt操作,它也会捕获到中断信号,并且擦除线程的interrupt标识,Thread的API为我们提供了三个不同的join方法,具体如下:public final void join() throws InterruptedExceptionpublic final synchronized void join(long millis,int nanos)

2021-03-30 10:49:07 113

原创 Thread的API详细介绍(二)线程的打断

文章目录1 线程打断(interrupt)1.1 interrupt()方法1.2 isInterrupted方法1.3 interrupted()方法1.4 isInterrupted和interrupted的其他说明1 线程打断(interrupt)// 打断线程public void interrupt();// 是否打断public static boolean interrupted();// 是否打断public boolean isInterrupted();1.1 inte

2021-03-28 22:30:35 304

原创 Thread的API详细介绍(一)

文章目录1 线程的休眠(sleep)1.1 sleep方法介绍1.2 使用TimeUnit替代Thread.sleep2 线程的 yield2.1 yield方法介绍2.2 yield和sleep3 设置线程的优先级3.1 线程优先级介绍3.2 线程优先级源码分析3.3 关于优先级的一些总结4 获取线程id5 获取当前线程6 设置线程上下文类加载器(先了解)方法名static功能说明注意start启动一个新线 程,在新的线程 运行 run 方法 中的代码start 方法只

2021-03-28 21:24:35 154

原创 深入理解Thread构造函数

1 线程的命名在构造线程的时候可以为线程起一个有特殊意义的名字,这也是比较好的一种做法,尤其在一个线程比较多的程序中,为线程赋予一个包含特殊意义的名字有助于问题的排查和线程的跟踪,推荐在构造线程的时候赋予它一个名字。1.1 默认线程命名规则下面的几个构造函数中,并没有提供为线程命名的参数,那么此时线程会有一个怎样的命名呢?Thread ()Thread(Runnable target)Thread(ThreadGroup group,Runnable target)public Threa

2021-03-28 11:54:40 1112 2

原创 Runnable接口的引入以及策略模式在Thread中的使用

1 Runnable接口介绍@FunctionalInterfacepublic interface Runnable { public abstract void run();}这个接口定义的目的就是将线程的执行单元从Thread类抽离出来(解耦),之前看过Thread的run方法: private Runnable target; @Override public void run() { // 如果使用runnable构造Thread,就会调用runnable接口的r

2021-03-27 20:11:07 423

原创 Start方法简单剖析:模板设计模式在Thread中的应用

1 start源码/**使线程开始执行;Java虚拟机调用这个线程的run方法。产生的结果:当前线程从对start方法的调用返回和另一个线程(执行其run方法)。一个线程多次启动是不合法的。特别地,线程在完成执行后可能不会重新启动。**/public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); gro

2021-03-26 18:09:26 216

原创 线程的生命周期详解

每一个线程都有自己的局部变量表、程序计数器,以及生命周期等,本节就来分析一下线程的生命周期1 线程的NEW状态当我们用关键字new创建一个Thread对象时,此时它并不处于执行状态,因为没有调用start方法启动该线程,那么线程的状态为NEW状态,准确地说,它只是Thread对象的状态,因为在没有start之前,该线程根本不存在,与你用关键字new创建一个普通的Java对象没什么区别。NEW状态通过start方法进入RUNNABLE状态。2 线程的RUNNABLE状态(可执行状态)**线程对

2021-03-26 16:32:16 845

原创 07 Feign扩展之Contract接口

这个接口决定了哪些注解可以标注在接口上还是方法上是有效的,并且提取处有效的信息,组装成为MethodMetaData元信息。1 Contract接口public interface Contract { // targetType:就是客户端接口的的class类型 // 此方法来解析类中链接到HTTP请求的方法:提取有效信息到元信息存储 // MethodMetadata:方法各种元信息,包括但不限于 // 返回值类型returnType // 请求参数、请求参数的index、名称 // u

2021-03-23 22:32:31 660

原创 06 Feign拦截器RequestInterceptor

请求拦截器可以在不同的请求目标实例(feign.builder创建的客户端)间共享,并且是线程安全的。请求的转换之前完成拦截(RequestTemplate转为feign.Request),它的作用只能是对请求模版做定制,而不能再对Request做定制了。文章目录1 RequestInterceptor接口1.1 默认实现:BasicAuthRequestInterceptor1.2 自定义实现:同一设置Token1 RequestInterceptor接口public interface Requ

2021-03-23 22:14:31 1960

原创 05 Feign的解码器处理响应数据

解码器就是用于Response1 Decoderpublic interface Decoder { // response:代表请求响应 // type:代表方法的返回值类型 // 它还有个特点:抛出了三种异常 // 但其实除了IOException,其它两种都是unchecked异常 Object decode(Response response, Type type) throws IOException, DecodeException, FeignException;}将H

2021-03-23 13:30:27 3089

原创 04 Feign扩展之编码(Encoder)

文章目录1 问题引入2 Encoder接口2.1 默认实现2.2 何时生效都标注有@Param注解,并且都被模版使用了都标注有@Param注解,但模版只使用一个都标注有@Param注解,但模版都没有使用feign具有很强的扩展性,允许用户根据需要进行定制,如HTTP客户端OkHttp, HTTP/2 client, SLF4J日志的使用, 编解码,错误处理等。使用时可以通过Feign.builder()创建api客户端时配置自定义组件。1 问题引入前面已经提过,feign默认是调用对象的toStrin

2021-03-22 22:14:50 4795

原创 03 Feign发送Post请求

1 url传递参数这个和get没有啥区别,就简单介绍服务提供者 /** * 测试一个参数 * * @return */ @PostMapping("/post") public String test01(@RequestParam String name) { return name; } /** * 测试Map * * @return */ @PostM

2021-03-20 21:31:20 6157

原创 02 Feign发送get请求

大家接触Feign都是通过Spring Cloud,平时使用的均是Spring MVC的注解。但是Feign是完全不依赖SpringMvc的注解的,是可以直接使用的哟。文章目录1 准备工作1.1 准备工作:Feign日志打印1.2 准备工作:定义一个Feign客户端构建器1 Get请求入门1.1 案例1.2 API讲解(一)1.2.1 RequestLine注解1.2.2 Param注解2 Get请求:请求参数为Map2.1 案例2.2 API讲解(二)2.2.1 QueryMap注解1 准备工作1.

2021-03-20 18:37:01 852

原创 09 服务端代码Demo(NIO)

文章目录1 阻塞式服务端1.1 服务端1.2 测试2 非阻塞式服务端2.1 处理连接事件2.2 处理读就绪事件使用nio包下的类简单实现一个服务端代码熟悉前面介绍的API采用阻塞式采用非阻塞阻塞和非阻塞混用1 阻塞式服务端1.1 服务端采用阻塞模式,用线程池中的工作线程处理每个客户连接。当ServerSocketChannel与SocketChannel采用默认的阻塞模式时,为了同时处理多个客户的连接,必须使用多个线程。在EchoServer类中,利用java.util.concurr

2021-03-18 15:21:06 245 1

原创 05 查看文件内容

文章目录1 查看文件类型(file命令)2 查看文件内容2.1 cat命令Linux中有几个命令可以查看文件的内容,而不需要调用其他文本编辑器1 查看文件类型(file命令)在显示文件内容之前,应该先了解一下文件的类型。如果打开了一个二进制文件,你会在屏幕上看到各种乱码,甚至会把你的终端仿真器挂起。file命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型的$ file my_file my_file: ASCII text上面例子中的文件是一个text(文本)文件

2021-03-17 08:58:42 114

原创 04 处理目录

文章目录1 创建目录(mkdir)1.1 创建父子目录(-P参数)2 删除目录(rmdir)2.1 递归删除(rm命令 -r参数)在Linux中,有些命令(比如cp,mv)对文件和目录都有效,而有些只对目录有效。1 创建目录(mkdir)mkdir 目录名eg:[admin@iZbp1hld5mqm15c6sdgqfkZ ~]$ mkdir newDir[admin@iZbp1hld5mqm15c6sdgqfkZ ~]$ lltotal 12drwxrwxr-x 2 admin admin

2021-03-17 08:42:35 68

原创 08 非阻塞通信的API基本介绍

1 缓冲区Bufferjava.nio包公开了Buffer API,使得Java程序可以直接控制和运用缓冲区。数据输入和输出往往是比较耗时的操作。缓冲区从两个方面提高I/O操作的效率:减少实际的物理读写次数。缓冲区在创建时被分配内存,这块内存区域一直被重用,这可以减少动态分配和回收内存区域的次数java.nio.Buffer类是一个抽象类,不能被实例化。共有8个具体的缓冲区类:1.1 缓冲区的几个属性容量(capacity):表示该缓冲区可以保存多少数据。极限(limit):表示

2021-03-16 14:38:28 347

原创 03 处理文件

文章目录1 创建文件1 创建文件可用touch命令轻松创建空文件。[admin@iZbp1hld5mqm15c6sdgqfkZ hello]$ touch test_touch[admin@iZbp1hld5mqm15c6sdgqfkZ hello]$ lstest_touchouch命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是零,因为touch命令只创建了一个空文件。[admin@iZbp1hld5mqm15c6sdgqfkZ hello]$ lltotal

2021-03-08 13:19:02 81

原创 02 Linux的文件系统及相关的命令

文章目录1 Linux 文件系统2 pwd命令1 Linux 文件系统Linux将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)。虚拟目录将安装在PC上的所有存储设备的文件路径纳单个目录结构中。Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出。Windows:c:\Users\Rich\Documents\test.docLinux:/home/Rich/Documents/test.d

2021-03-08 12:38:43 78

原创 07 非阻塞通信的基本思想

文章目录1 非阻塞通信的基本思想之前的accept,read的等方法都是阻塞,当没有连接或者没有数据,线程都会被阻塞在当前方法执行处。所以为了上一节为了能够处理同时和多个客户端通信,每个客户端请求来临都是分配了一个线程去处理的jdk1.4以后,java引入了非阻塞的通信机制,服务端程序只需要启动一个线程就能完成和多个客户通信的任务。1 非阻塞通信的基本思想假如同时需要做两件事,烧开水和煮粥。烧开水的步骤如下:放水,打开煤气等待水烧开 // 阻塞关闭煤气,倒入水壶煮粥的步骤一下:放水和

2021-03-05 17:36:14 223

原创 06 ServerSocket用法详解(二)创建多线程的服务器

文章目录1 引入1 引入之前的的程序的骨架都是这样的: public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; while (true){ Socket socket = null; try { // 1 创建ServerSocket, 并指定端口号为9999 s

2021-03-03 17:35:04 397

空空如也

空空如也

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

TA关注的人

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