首页
学习
活动
专区
工具
TVP
发布

Coding Diary

与你分享我的学习笔记
专栏作者
42
文章
47134
阅读量
12
订阅数
ActiveMQ入门
Apache ActiveMQ是当前最流行的开源的,支持多协议的,基于Java的消息中间件,官网的原话是:Apache ActiveMQ™ is the most popular open source, multi-protocol, Java-based messaging server.
CodingDiray
2020-04-24
8911
JDK内置工具命令
jps(Java Virtual Machine Process Status Tool)显示当前所有Java进程pid的命令
CodingDiray
2019-10-20
5580
JVM垃圾回收机制
Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由 JIT 编译器进行一些优化),因此这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。 而 Java 堆不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的是这部分内存。
CodingDiray
2019-10-14
4230
Java类加载机制
在了解类的加载机制之前,我们需要了解一下类的生命周期。Java类从被加载到JVM内存开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)七个阶段。
CodingDiray
2019-10-10
5630
Netty中粘包和拆包的解决方案
粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包问题。
CodingDiray
2019-09-29
6580
Java网络编程--Netty中的ByteBuf
由于JDK中提供的ByteBuffer无法动态扩容,并且API使用复杂等原因,Netty中提供了ByteBuf。
CodingDiray
2019-09-25
6490
Java网络编程--Netty中的责任链
责任链模式(Chain of Responsibility Pattern)是一种是行为型设计模式,它为请求创建了一个处理对象的链。其链中每一个节点都看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。
CodingDiray
2019-09-25
1.2K0
Java网络编程--Netty入门
Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发。它是一个NIO框架,对Java NIO进行了良好的封装。作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。
CodingDiray
2019-09-25
4900
Reactor模式
Reactor模式是一种设计模式,它是基于事件驱动的,可以并发的处理多个服务请求,当请求抵达后,依据多路复用策略,同步的派发这些请求至相关的请求处理程序。
CodingDiray
2019-09-25
1.9K0
Java网络编程--NIO非阻塞网络编程
从Java1.4开始,为了替代Java IO和网络相关的API,提高程序的运行速度,Java提供了新的IO操作非阻塞的API即Java NIO。NIO中有三大核心组件:Buffer(缓冲区),Channel(通道),Selector(选择器)。NIO基于Channel(通道)和Buffer(缓冲区))进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中,而Selector(选择器)主要用于监听多个通道的事件,实现单个线程可以监听多个数据通道。
CodingDiray
2019-09-25
8580
Java网络编程--BIO阻塞式网络编程
阻塞(blocking)IO :阻塞是指结果返回之前,线程会被挂起,函数只有在得到结果之后(或超时)才会返回
CodingDiray
2019-09-25
9300
JDK容器类List,Set,Queue源码解读
List,Set,Queue都是继承Collection接口的单列集合接口。List常用的实现主要有ArrayList,LinkedList,List中的数据是有序可重复的。Set常用的实现主要是HashSet,Set中的数据是无序不可重复的。Queue常用的实现主要有ArrayBlockingQueue,LinkedBlockingQueue,Queue是一个保持先进先出的顺序队列,不允许随机访问队列中的元素。
CodingDiray
2019-09-25
3510
深入理解Java中的锁(一)
自旋锁 :是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断判断锁是否能够被成功获取,直到获取到锁才会退出循环。
CodingDiray
2019-09-25
3700
Java内存模型以及线程安全的可见性问题
首先Java内存模型(JMM)和JVM运行时数据区并不是一个东西,许多介绍Java内存模型的文章描述的堆,方法区,Java虚拟机栈,本地方法栈,程序计数器这东西并不是Java内存模型的内容而是JVM运行时数据区的内容。 要理解二者的区别就要了解《Java虚拟机规范》和《Java语言规范》。我们知道Java虚拟机上并不知只有Java语言,像JRuby, ,Scala,Kotlin,Groovy等也都运行在Java虚拟机上,而这些语言想要在Java虚拟机上运行就要遵守《Java虚拟机规范》,而JVM运行时数据区就是《Java虚拟机规范》的内容。而《Java语言规范》就只是针对Java语言的规范,它对Java内存模型做了详细的描述。
CodingDiray
2019-09-25
8510
线程池应用及实现原理剖析
为什么要用线程池 线程是不是越多好? 线程在Java中是一个对象, 更是操作系统的资源, 线程额创建和销毁都需要时间,如果 创建时间+销毁时间>执行任务时间 就很不合算 Java对象占用堆内存,操作系统线程占用系统内存, 根据JVM规范,一个线程默认最大栈大小为1M, 这个栈空间是要从操作系统内存中分配的,线程过多会消耗很多的内存 操作系统频繁切换线程上下文会影响性能 线程池的推出就是为了控制线程数量 线程池原理 - 概念 线程池管理器: 用于创建并管理线程池, 包括创建线程池, 销毁线程池, 添加新任务
CodingDiray
2019-09-25
4020
Java中实现线程的方式
Java中实现多线程的方式的方式中最核心的就是 run()方法,不管何种方式其最终都是通过run()来运行。
CodingDiray
2019-09-25
4320
线程的通信和封闭
要想实现线程之间的协同, 如: 线程先后执行顺序, 获取某个线程的执行结果等, 涉及线程之间的相互通信, 分为下面四类
CodingDiray
2019-09-25
4930
线程状态
代码测试 第一种状态切换 - 新建 -> 运行 -> 终止 // 第一种状态切换 - 新建 -> 运行 -> 终止 System.out.println("#######第一种状态切换 - 新建 -> 运行 -> 终止################################"); Thread thread1 = new Thread( new Runnable() { @Override public void run() { System.out.println("thread1当前状态:" + Thread.currentThread().getState().toString()); System.out.println("thread1 执行了"); } }); System.out.println("没调用start方法,thread1当前状态:" + thread1.getState().toString()); thread1.start(); Thread.sleep(2000L); // 等待thread1执行结束,再看状态 System.out.println("等待两秒,再看thread1当前状态:" + thread1.getState().toString()); // thread1.start(); TODO 注意,线程终止之后,再进行调用,会抛出IllegalThreadStateException异常 输出结果: #######第一种状态切换 - 新建 -> 运行 -> 终止################################ 没调用start方法,thread1当前状态:NEW thread1当前状态:RUNNABLE thread1 执行了 等待两秒,再看thread1当前状态:TERMINATED 第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式) System.out.println( "############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)###########################"); Thread thread2 = new Thread( new Runnable() { @Override public void run() { try { // 将线程2移动到等待状态,1500后自动唤醒 Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread2当前状态:" + Thread.currentThread().getState().toString()); System.out.println("thread2 执行了"); } }); System.out.println("没调用start方法,thread2当前状态:" + thread2.getState().toString()); thread2.start(); System.out.println("调用start方法,thread2当前状态:" + thread2.getState().toString()); Thread.sleep(200L); // 等待200毫秒,再看状态 System.out.println("等待200毫秒,再看thread2当前状态:" + thread2.getState().toString()); Thread.sleep(3000L); // 再等待3秒,让thread2执行完毕,再看状态 System.out.println("等待3秒,再看thread2当前状态:" + thread2.getState().toString()); 输出结果: ############第二种:新建 -> 运行 -> 等待 -> 运行 -> 终止(sleep方式)########################### 没调用start方法,thread2当前状态:NEW 调用start方法,thread2当前状态:RUNNABLE 等待200毫秒,再看thread2当前状态:TIMED_WAITING thread2当前状态:RUNNABLE thread2 执行了 等待3秒,再看thread2当前状态:TERMINATED 第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止 System.out.println("############第三种:新建 -> 运行 -> 阻塞 -> 运行 -> 终止#####################
CodingDiray
2019-09-25
7670
Java程序运行原理分析
线程独占: 每个线程都会有它独立的空间,随线程的生命周期而创建和销毁 线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁 方法区
CodingDiray
2019-09-25
9870
没有更多了
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档