JAVA
猪猪猪猪猪鸭
十年磨一剑。
展开
-
TCP长连接和短连接的区别
当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的示意图: ...原创 2019-07-07 23:42:12 · 632 阅读 · 0 评论 -
JAVA中的Random()函数,获取随机数
Java中存在着两种Random函数:一、java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。例子如下:package IO;import java.util.Random;public cla...原创 2018-04-25 08:25:07 · 5889 阅读 · 0 评论 -
Java Thread.join()详解
一、使用方式。join是Thread类的一个方法,启动线程后直接调用,例如:[java] view plain copyThread t = new AThread(); t.start(); t.join(); 二、为什么要用join()方法在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程...原创 2018-03-26 20:34:06 · 257 阅读 · 0 评论 -
架构高性能网站秘笈(三)——浏览器缓存
什么是浏览器缓存?在《架构高性能网站秘笈(二)——动态内容缓存》中我们知道,当不同用户请求相同数据时,动态内容缓存能够避免服务器的重复计算,从而降低用户的等待时间。但如果是同一个用户请求相同的数据,即使服务器能避免重复计算,但仍需将重复的数据传递给浏览器。若使用浏览器缓存,则同一个用户请求相同的数据时,浏览器只需从自己本地读取,无需从服务器上获取。从而大大降低用户的等待时间,减少了服务器的压力,可...原创 2018-03-21 14:41:52 · 222 阅读 · 0 评论 -
架构高性能网站秘笈(二)——动态内容缓存
什么是动态内容缓存?浏览器向服务器发送请求后,服务器会根据浏览器的要求做相应的处理(如:数据库操作),然后将处理后的结果注入JSP页面生成HTML,最后将生成的HTML返回给浏览器显示。我们知道,数据库读取操作是非常耗时的,如果能将每次请求中的数据库处理时间去掉,那服务器的相应速度将会大幅提升。要实现这一点,我们就需要将常用的HTML页面事先生成好,当用户发出请求时,服务器只需从缓存中取出即可,无...原创 2018-03-21 14:40:56 · 198 阅读 · 0 评论 -
架构高性能网站秘笈(一)——了解衡量网站性能的指标
服务器如何发送数据?服务器程序将需要发送的数据写入该程序的内存空间中;服务器程序通过操作系统的接口向内核发出系统调用;系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取;此后CPU转而做其他处理;网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中;网卡将字节转换成二进制位,再以电信号的形式输出至网络。注意:数据在计算机内部的复制是按照总线的宽度来复制的。比如在32位的操作...原创 2018-03-21 14:40:16 · 567 阅读 · 0 评论 -
java面试-计算机网络传输层知识点全覆盖
点击打开网络通信的七层协议传输层概述作用:传输层为它上面的应用层提供通信服务。在OSI七层参考模型中,传输层是面向通信的最高层,也是用户功能的最底层。传输层两大重要的功能:复用 和 分用。 复用:在发送端,多个应用进程公用一个传输层;分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。和网络层的区别: 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。网络层只对报文...原创 2018-03-21 13:20:39 · 1487 阅读 · 0 评论 -
深入理解JVM(九)——类加载的过程
通过之前的介绍可知,类加载过程共有5个步骤,分别是:加载、验证、准备、解析、初始化。其中,验证、准备、解析称为连接。下面详细介绍这5个过程JVM所做的工作。加载注意:“加载”是“类加载”过程的第一步,千万不要混淆。1. 加载的过程在加载过程中,JVM主要做3件事情:通过一个类的全限定名来获取这个类的二进制字节流,即class文件: 在程序运行过程中,当要访问一个类时,若发现这个类尚未被加载,并满...原创 2018-03-20 00:14:32 · 300 阅读 · 0 评论 -
深入理解JVM(八)——类加载的时机
类的生命周期一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载——>验证——>准备——>解析——>初始化——>使用——>卸载其中,类加载包括5个阶段: 加载——>验证——>准备——>解析——>初始化在类加载的过程中,以下3个过程称为连接: 验证——>准备——>解析因此,JVM的类加载过程也可以概括为3个过程: 加载—...原创 2018-03-20 00:14:40 · 245 阅读 · 0 评论 -
Java并发编程的艺术(十二)——线程安全
1. 什么是『线程安全』?如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。2. 线程安全的几种程度线程安全性的前提:对『线程安全性』的讨论必须建立在对象内部存在共享变量这一前提,若对象在多条线程间没有共享数据,那这个对象一定是线程安全的!2.1. 绝对的线程安全上述线程安全性的定义即为绝对线程安全的情况,即:一个对象在构造完...原创 2018-05-12 10:24:22 · 311 阅读 · 0 评论 -
Java并发编程的艺术(十三)——锁优化
自旋锁背景:互斥同步对性能最大的影响是阻塞,挂起和恢复线程都需要转入内核态中完成;并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得。原理:当一条线程需要请求一把已经被占用的锁时,并不会进入阻塞状态,而是继续持有CPU执行权等待一段时间,该过程称为『自旋』。优点:由于自旋等待锁的过程线程并不会引起上下文切换,因此比较高效;缺点:自旋等待过程线程一直占...原创 2018-05-12 10:26:25 · 259 阅读 · 0 评论 -
Java的四种引用方式
java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。java对象的引用包括 强引用,软引用,弱引用,虚引用Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:1.强引用 是指创建一个对象并把这个对...原创 2018-11-24 20:27:21 · 396 阅读 · 0 评论 -
开发常用的设计模式梳理
基础学习:UML四种关系耦合度大小关系泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖依赖(Dependency)一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类**依赖于**Car类和House类这里注意与下面的关联关系区分:Person类里并没有使用Car和House类型的属性,Car和House的实例是以...原创 2018-10-23 22:13:05 · 361 阅读 · 0 评论 -
java面经大全,献给每一个努力过,在努力以及将要努力的人。goodlucky。2018-10-15开始更新
java面经大全,献给每一个努力过,在努力以及将要努力的人。goodlucky。2018-10-15开始更新首先是jvm,jvm1.8之后包括1.9都有新特性,希望看完后面的1.8java虚拟机jvm深入理解JVM(一)——JVM内存模型深入理解JVM(二)——揭开HotSpot对象创建的奥秘深入理解JVM(三)——垃圾收集策略详解深入理解JVM(四)——对象内存的分配...原创 2018-10-15 20:04:06 · 539 阅读 · 2 评论 -
jdk1.8 利用流字符串转集合
List<Long> idList = Arrays.stream(StringUtils.split(ids, ",")) .map(id -> Long.parseLong(id.trim())) .collect(Collectors.toList()); List<Obje...原创 2018-08-02 14:51:26 · 3912 阅读 · 0 评论 -
Java中使用HttpRequest获取用户真实IP地址端口
import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author rainyday * */ public class CusAccessObjectUtil { /** * 获取用户真实IP地址,不使用reques...原创 2018-08-02 13:55:55 · 1437 阅读 · 0 评论 -
isEmpty和null以及""的区别
isEmpty和null的区别:1.一个是对象为空(IsNull),一个是值为空(IsEmpty)2.IsNull指任务类型变量是否为空包括对象类型的变量。IsNull函数:功能:返回Boolean的值,指明表达是否不包含任何有效数据。NULL表示的是数据值未知或不可用,它不表示零(数字值或二进制值)、零长度的字符串或空白(字符值)。3.IsEmpty函数:功能:用于判断一个变量是否已初始化,如果...原创 2018-05-06 16:54:02 · 2087 阅读 · 0 评论 -
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
什么是死锁死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。死锁产生...原创 2018-05-19 10:26:56 · 1450 阅读 · 0 评论 -
Java并发容器大合集
概述 java.util包中的大部分容器都是非线程安全的,若要在多线程中使用容器,你可以使用Collections提供的包装函数:synchronizedXXX,将普通容器变成线程安全的容器。但该方法仅仅是简单地给容器使用同步,效率很低。因此并发大师Doug Lea提供了java.util.concurrent包,提供高效的并发容器。并且为了保持与普通的容器的接口一致性,仍然使用ut...原创 2018-05-12 10:29:08 · 794 阅读 · 3 评论 -
深入理解JVM(七)——Class文件结构
什么是JVM的“无关性”?Java具有平台无关性,也就是任何操作系统都能运行Java代码。之所以能实现这一点,是因为Java运行在虚拟机之上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现“一次编写,处处运行”。而JVM不仅具有平台无关性,还具有语言无关性。 平台无关性是指不同操作系统都有各自的JVM,而语言无关性是指Java虚拟机能运行除Java以外的代码!这听起来非常惊人,但JV...原创 2018-03-20 00:14:48 · 252 阅读 · 0 评论 -
深入理解JVM(六)——JVM性能调优实战
如何在高性能服务器上进行JVM调优?为了充分利用高性能服务器的硬件资源,有两种JVM调优方案,它们都有各自的优缺点,需要根据具体的情况进行选择。1. 采用64位操作系统,并为JVM分配大内存我们知道,如果JVM中堆内存太小,那么就会频繁地发生垃圾回收,而垃圾回收都会伴随不同程度的程序停顿,因此,如果扩大堆内存的话可以减少垃圾回收的频率,从而避免程序的停顿。因此,人们自然而然想到扩大内存容量。而32...原创 2018-03-20 00:14:57 · 393 阅读 · 0 评论 -
深入理解JVM(五)——HotSpot垃圾收集器详解
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器。我们可以根据自己实际的应用需求选择最适合的垃圾收集器。根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率。 新生代垃圾收集器1. Serial垃圾收集器单线程 只开启一条GC线程进行垃圾回收,并且在垃圾回收过程中停止一切用户线程,从而用户的请求或图形化...原创 2018-03-20 00:15:04 · 235 阅读 · 0 评论 -
Java并发编程的艺术(三)——volatile
1. 并发编程的两个关键问题并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行;但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 与 同步。通信 通信是指消息在两条线程之间传递。 既然要传递消息,那接收线程 和 发送线程之间必须要有个先后关系,此时就需要用到同步。通信和同步是相辅相成的。同步 同步是指,控制多条线程之间的执行次序...原创 2018-03-19 15:34:13 · 324 阅读 · 0 评论 -
Java并发编程的艺术(四)——线程的状态
线程的状态初始态:NEW创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。运行态:RUNNABLE在Java中,运行态包括就绪态 和 运行态。就绪态 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。所有就绪态的线程存放在就绪队列中。运行态 获得CPU执行权,正在执行的线程。由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行...原创 2018-03-19 15:33:20 · 312 阅读 · 1 评论 -
Java并发编程的艺术(五)——中断
什么是中断?在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupted方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位...原创 2018-03-19 15:32:06 · 313 阅读 · 0 评论 -
Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同。1. volatile、synchronized关键字PS:关于volatile的详细介绍请移步至:Java并发编程的艺术(三)——volatile1.1 如何实现通信?这两种方式都采用了同步机制实现多条线程间的数据通信。与其说是“通信”,倒不如说是“共享变量”来的恰当。当一个共享变量被volatile修饰 或...原创 2018-03-19 15:31:20 · 444 阅读 · 1 评论 -
Java并发编程的艺术(七)——Executors
Executors框架简介Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逸出。E...原创 2018-03-19 15:30:35 · 231 阅读 · 0 评论 -
Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
1. 闭锁:CountDownLatch1.1 使用场景若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。1.2 代码实现// 初始化闭锁,并设置资源个数CountDownLatch latch = new CountDownLatch(2);Thread t1 = new Thread( new Runnable(){ public ...原创 2018-03-19 15:29:33 · 273 阅读 · 0 评论 -
Java并发编程的艺术(九)——批量获取多条线程的执行结果
当向线程池提交callable任务后,我们可能需要一次性获取所有返回结果,有三种处理方法。方法一:自己维护返回结果// 创建一个线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 存储执行结果的ListList<Future<String>> results = new A...原创 2018-03-19 15:28:23 · 338 阅读 · 1 评论 -
Java并发编程的艺术(十一)——线程池(2)
Executor两级调度模型 在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程。 在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执行它们; 在操作系统层面,操作系统再将这些线程分配给处理器执行。Executor结构 Executor框架中的所有类可以分成三类:任务 任务有两种类型:Runnable和Callable。任务执行器 ...原创 2018-03-19 15:26:50 · 294 阅读 · 0 评论 -
Java并发编程的艺术(二)——重排序
当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此。什么是重排序?重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。重排序分类重排序分为:编译器重排序 和 处理器重排序。数据依赖编译器和处理器并不会随意的改变指令的执行顺序,因为有些指令之间是有依赖关系的,若改变了他们的执行顺序,就会出现错误的结果。 因此,编译器和处理器只...原创 2018-03-19 15:35:01 · 330 阅读 · 0 评论 -
6种Java序列化框架
下面介绍几种常用的Java序列化技术,耗时比较,单位纳秒0.002511:com.my.tools.serialize.KryoRegisterSerialize0.007207:com.my.tools.serialize.FSTSerialize0.00811:com.my.tools.serialize.KryoSerialize0.010137:com.my.tools.serialize...原创 2018-03-23 00:17:06 · 3985 阅读 · 0 评论 -
深入理解JVM(四)——对象内存的分配策略
Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配。在Java虚拟机的五块内存空间中,程序计数器、Java虚拟机栈、本地方法栈内存的分配和回收都具有确定性,一般在编译阶段就能确定需要分配的内存大小,并且由于都是线程私有,因此它们的内存空间都随着线程的创建而创建,线程的结束而回收。也就是这三个区域的内存分配和回收都具有确定性,垃圾回收器不需要在这里花费太大的精力。而Java虚拟机中...原创 2018-03-20 00:15:12 · 351 阅读 · 0 评论 -
深入理解JVM(三)——垃圾收集策略详解
Java虚拟机的内存模型分为五个部分,分别是:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障Java虚拟机能够健康地持续运行。这个垃圾收集者就是平常我们所说的“垃圾收集器”,那么垃圾收集器在何时清扫内存?清扫哪些数据?这就是接下来我们要解决的问题。 ...原创 2018-03-20 00:15:21 · 328 阅读 · 0 评论 -
深入理解JVM(二)——揭开HotSpot对象创建的奥秘
对象的创建过程当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用; 若常量池中没有这个类的符号引用,说明这个类还没有被定义!抛出ClassNotFoundException; 若常量池中有这个类的符号引用,则进行下一步工作; 进而检查这个符号引用所代表的类是否已经被JVM加载; 若该类还没有被加...原创 2018-03-20 00:15:27 · 328 阅读 · 0 评论 -
深入理解JVM(一)——JVM内存模型
JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。下面对这五个区域展开深入的介绍。 1. 程序计数器1.1. 什么是程序计数器?程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正...原创 2018-03-20 00:15:35 · 2611 阅读 · 0 评论 -
java-面试-Java并发容器大合集
概述 java.util包中的大部分容器都是非线程安全的,若要在多线程中使用容器,你可以使用Collections提供的包装函数:synchronizedXXX,将普通容器变成线程安全的容器。但该方法仅仅是简单地给容器使用同步,效率很低。因此并发大师Doug Lea提供了java.util.concurrent包,提供高效的并发容器。并且为了保持与普通的容器的接口一致性,仍然使用ut...原创 2018-03-20 00:15:42 · 3830 阅读 · 0 评论 -
Java并发编程的艺术(一)——并发编程需要注意的问题
并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题:上下文切换死锁资源限制接下来会逐一分析这三个问题,并给出相应的解决方案。问题一:上下文切换会带来额外的开销线程的运行机制一个CPU每个时刻只能执行一条线程;操作系统给每条线程分配不同长度的时间片;操作系统会从一堆线程中随机选取一条来执行;每条线程用完自...原创 2018-03-20 00:15:56 · 439 阅读 · 0 评论 -
正向代理和反向代理
正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录。结论就是,正向代理,是一个位于客户端和原始服务器(origin server)...原创 2018-03-24 10:25:07 · 198 阅读 · 0 评论 -
RocketMQ集群配置
RocketMQ 网络部署特点Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。Broker部署相对复杂,Broker 分为Master与Slave,一个Master 可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId来定 义,BrokerId为0 表示M...原创 2018-03-23 00:19:13 · 813 阅读 · 0 评论