
Java
文章平均质量分 81
huaishu
这个作者很懒,什么都没留下…
展开
-
Netty4 各种源码文章后的总结
把Netty4关于源码解读的文章看完以后还是很多疑惑,例如:Netty是基于一个怎样的点来设计框架的(解决了一个什么样的痛点),把这些文章归纳总结很有必要。Java NIO的网络编程基本原理 如何拆解串行流程 整理Netty的数据流程Java NIO 网络编程基本代码分析// 创建一个selector Selector selector = Selector.open(); // 创建一个ServerSocketChannel ServerSo原创 2021-03-01 14:33:47 · 310 阅读 · 3 评论 -
Netty4实战解读后思考
看过TCP/IP协议,也看过关于Netty方面的代码,总结一下疑惑的地方。关于伪异步IO模型,为什么会慢?当消息的接收方处理缓慢的时候,将不能及时从TCP缓冲区读取数据,将会导致发送方的TCP“窗口”大小不断减小,直至为0,双方处于Keep-Alive状态,消息发送方将不能再向TCP缓冲区写入消息,如果采用的是同步阻塞I/O,写操作将会无限期阻塞,直到TCP“窗口”大小大于0或发生I/O异常。如果不是同步阻塞I/O,会怎么样。Netty4数据传输图Channel 绑定到 ChannelP原创 2021-01-29 22:13:01 · 266 阅读 · 0 评论 -
关于移动端token解决方案
在开发web端项目过程中,经常会接触到cookie、sessionId这些东西,移动端开发过程中,更多会使用token这个概念,其实属于同一个概念,都是如何验证用户的合法性所涉及的概念。最原始的解决方法可能是生成一个随机数作为token在服务端进行保存,redis是一个好的内存数据保存办法。JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。其JWT的组成:一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。原创 2021-01-12 19:55:43 · 1949 阅读 · 2 评论 -
Java锁及实现方式
锁的概念在数据库出现比较多,为了实现数据库的不同隔离级别,数据库会定义不同的锁类型。Java为了实现同步及线程安全,也会定义不同的锁。所谓的同步操作即原子操作(atomic operation)意为“不可被中断的一个或一系列操作”,类似数据库中的事务。线程安全实现方式互斥同步(锁机制)互斥是实现同步的一种手段,临界区(Critical Section)、互斥量(Mutex)和信号量(S...原创 2019-11-26 14:03:50 · 5248 阅读 · 0 评论 -
Java并发机制----同步synchronized以及原子操作
Java并发编程过程中必须接触synchronized和volatile,以及后来的读写锁ReadWriteLock、重入锁ReentrantLock等,JVM在编译synchronized时会生成2个指令集monitorenter和monitorexit,volatile则实现1)将当前处理器缓存行的数据写回到系统内存。2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。...原创 2019-11-19 15:51:24 · 425 阅读 · 0 评论 -
聊聊并发(八)——Fork/Join 框架介绍
1. 什么是 Fork/Join 框架Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过 Fork 和 Join 这两个单词来理解下 Fork/Join 框架,Fork 就是把一个大任务切分为若干子任务并行的执行,Join 就是合并这些子任务的执行结果,最后得到这个大任务的...转载 2019-05-10 14:41:47 · 378 阅读 · 0 评论 -
聊聊并发(七)——Java 中的阻塞队列
1. 什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:...转载 2019-05-10 14:42:00 · 240 阅读 · 0 评论 -
SpringBoot SSL 双向认证配置
keytool -genkeypair -alias serverkey -keyalg RSA -dname "CN=Server,OU=Ziguo,O=Ziguo,L=Ziguo,S=NY,C=CN" -keypass bigkeystorepass -keystore server.jks -storepass bigkeystorepass keytool -genkeypair -a...原创 2020-06-08 21:57:18 · 2247 阅读 · 0 评论 -
Java ServiceLoader(SPI)学习
SPI ServiceLoader转载 2015-11-23 22:12:02 · 1097 阅读 · 0 评论 -
Java Threadlocal 的使用
电话面试问道Threadlocal使用需要注意什么?上网找到相关资料ThreadLocal可以为当前线程保存局部变量,而InheritableThreadLocal则可以在创建子线程的时候将父线程的局部变量传递到子线程中。如果使用了线程池(如Executor),那么即使即使父线程已经结束,子线程依然存在并被池化。这样,线程池中的线程在下一次请求被执行的时候,ThreadLoc...原创 2015-05-26 18:50:25 · 582 阅读 · 0 评论 -
双重检查锁定与延迟初始化
在 java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:public class UnsafeLazyInitialization {private static Instance instan...转载 2019-05-10 17:35:17 · 339 阅读 · 0 评论 -
Java集合ArrayList和LinkedList区别
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口。Java集合大致可以分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合;Queue体系集合,代表一种队列集合实现。jdk1.4以前没有Queue集合,一般用Linked...原创 2019-07-11 11:53:51 · 11716 阅读 · 2 评论 -
Java IO与NIO 操作
JAVA IO操作从数据来源或者说是操作对象角度看,IO 类可以分为:1、文件(file):FileInputStream、FileOutputStream、FileReader、FileWriter 2、数组([]): 2.1、字节数组(byte[]):ByteArrayInputStream、ByteArrayOutputStream 2.2、字符数组(char[]):Char...原创 2019-07-29 17:15:05 · 218 阅读 · 0 评论 -
Java 主流I/O 模型
JAVA 主流I/O模型比较 同步阻塞(BIO) 伪异步IO 非阻塞IO(NIO) 异步IO(AIO) 客户端个数:I/O线程 1:1 M:N(M可以大于N) M:1(1个I/O线程处理多个客户端连接) M:0(不需要启动额外的I/O线程,被动回调) I/O类型(阻塞) 阻塞I/O 阻塞I/O 非阻塞I/O 非阻...原创 2019-07-30 12:24:36 · 179 阅读 · 0 评论 -
Spring事务的传播机制
事务的传播机制:@Transactional(propagation=Propagation.REQUIRED)如果有事务,那么加入事务,没有的话新建一个(默认情况下)@Transactional(propagation=Propagation.NOT_SUPPORTED)容器不为这个方法开启事务@Transactional(propagation=Propagation.REQU...原创 2019-07-22 12:26:13 · 2461 阅读 · 0 评论 -
Java中的位操作以及位操作技巧
在C语言学习中位操作是单独拿出来讲的一章,在Java实践中相当少机会使用。位操作基础基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所示: & 与运算符、| 或运算符 、~ 取反运算符 、^ 异或运算符、>> 右移运算符、<< 左移运算符、>>>无符号右移运算符 在这6种操作符,只有~取反是单目操作符,...原创 2019-08-05 16:37:16 · 539 阅读 · 0 评论 -
Java线程的状态
线程状态状态名称 说明 NEW 初始状态,线程被构建,但是还没有调用start()方法 RUNNING 运行状态,Java线程将操作系统中的就绪和运行两种状态笼统地称作“运行” BLOCKED 阻塞状态,表示线程阻塞与锁 WAITING 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断)...原创 2019-08-19 15:39:25 · 231 阅读 · 0 评论 -
JVM指令集整理
最近看《Java并发编程的艺术》,涉及到一些硬件、JVM等知识,结合Java虚拟机知识,整理JVM指令集。JVM基本指令iconst_1 int型常量值1进栈 bipush 将一个byte型常量值推送至栈顶 iload_1 第二个int型局部变量进栈,从0开始计数 istore_1 将栈顶int型数值存入第二个局部变量,从0开始计数 iadd ...原创 2019-08-15 18:11:36 · 750 阅读 · 0 评论 -
Java内存查看与分析
业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分,仔细研究下jdk的工具,还是蛮有意思的呢:)1:gc日志输出在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+Prin...原创 2014-04-10 16:36:19 · 641 阅读 · 0 评论 -
Tomcat并发数优化的方法总结
可以在控制台的启动信息里看见,默认状态下没有被打开nio配置,启动时的信息,如下: 2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol init 信息: Initializing Coyote HTTP/1.1 on http-8080 2010-2-1 12:59:40 org.apache.catalina.start原创 2014-04-02 14:32:12 · 9247 阅读 · 0 评论 -
Javap使用说明
学习JVM知识看到JAVAP可以反编译出Class的二进制文件,很是好奇,收集网上资料以备学习。描述: javap命令分解一个class文件,它根据options来决定到底输出什么。如果没有使用options,那么javap将会输出包,类里的protected和public域以及类里的所有方法。javap将会把它们输出在标准输出上。来看这个例子,先编译下面这个类。原创 2013-08-21 12:22:00 · 1093 阅读 · 0 评论 -
深入理解Java内存模型(五)——锁
锁的释放 - 获取建立的 happens before 关系锁是 java 并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放 - 获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1 ...转载 2013-06-04 10:03:49 · 740 阅读 · 0 评论 -
深入理解Java内存模型(一)——基础
并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 - 读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必...转载 2013-06-04 09:56:22 · 733 阅读 · 0 评论 -
聊聊并发(六)——ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环 CAS 的方式来实现,本文让我们一起来研究下 Doug Lea 是如何使用非阻塞的方式来实现线程安全队列 Conc...转载 2013-06-13 11:09:43 · 755 阅读 · 0 评论 -
聊聊并发(五)——原子操作的实现原理
1. 引言原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在 Intel 处理器和 Java 里是如何实现原子操作的。2. 术语定义术语 英文 解释 缓存行 Cache line 缓存的最小操作单位 比...转载 2013-06-13 11:08:42 · 906 阅读 · 0 评论 -
聊聊并发(四)——深入分析ConcurrentHashMap
术语定义术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表 hash table 根据设定的哈希函数 H(key) 和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈...转载 2013-06-13 11:02:45 · 671 阅读 · 0 评论 -
聊聊并发(三)——JAVA线程池的分析和使用
1. 引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。2. 线...转载 2013-06-13 10:57:57 · 699 阅读 · 0 评论 -
聊聊并发(二)——Java SE1.6中的Synchronized
1 引言在多线程并发编程中 Synchronized 一直是元老级角色,很多人都会称呼它为重量级锁,但是随着 Java SE1.6 对 Synchronized 进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了 Java SE1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。2 术语定义 术语 英...转载 2013-06-13 10:55:55 · 695 阅读 · 0 评论 -
聊聊并发(一)——深入分析Volatile的实现原理
引言在多线程并发编程中 synchronized 和 Volatile 都扮演着重要的角色,Volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比 synchronized 的开销更小,本文将深入分析在硬件层面上 Inter 处理器是如何实现 Vola...转载 2013-06-13 10:52:52 · 771 阅读 · 0 评论 -
深入理解Java内存模型(二)——重排序
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量之后,...转载 2013-06-04 10:13:44 · 698 阅读 · 0 评论 -
深入理解Java内存模型(七)——总结
处理器内存模型顺序一致性内存模型是一个理论参考模型,JMM 和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM 和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和 JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。根据对不同类型读 / 写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面...转载 2013-06-04 12:55:30 · 613 阅读 · 0 评论 -
Java Concurrent 探秘
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的...转载 2013-07-06 13:21:51 · 637 阅读 · 0 评论 -
Java 并发核心编程
1、关于java并发自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接转载 2013-06-04 14:08:10 · 805 阅读 · 0 评论 -
wrapper在java应用中的bug
先介绍下wrapper是个什么东西,下面的简单解释是直接Google出来的:Java Service Wrapper可以把Java应用程序安装成一个Windows NT服务或Unix Daemon.它同时还为应用程序提供日记功能,灵活的配置,可靠的运行性能,按需求重新启动,简化应用程序的安装等。去年的java项目用了这个东西,在入口类使用接口WrapperListener,继承了W转载 2013-07-19 09:24:35 · 1467 阅读 · 0 评论 -
Jvm OutMemory解决方法
应用在开启一段时间后会出现OutMemory,可以加大PermSize解决。wrapper.java.additional.6= -XX:PermSize=128M wrapper.java.additional.7=-XX:MaxNewSize=256mwrapper.java.additional.8=-XX:MaxPermSize=128m原创 2013-07-19 09:22:23 · 702 阅读 · 0 评论 -
分析java程序中cpu占用过高的线程
查看服务器操作困难,服务端的一个java服务占用cpu200%多。该服务里面跑了很多线程,于是想找到是谁引起的1、首先dump出该进程的所有线程及状态使用命令 jstack PID 命令打印出CPU占用过高进程的线程栈.jstack -l 2626 > 2626.stack将进程id为5683的线程栈输出到了文件2、使用top命令找到耗cpu的线程 使用top -H ...原创 2013-07-01 19:02:50 · 2054 阅读 · 0 评论 -
深入理解Java内存模型(六)——final
与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问。对于 final 域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序。下面,我们通过一些示...转载 2013-06-04 10:04:59 · 698 阅读 · 0 评论 -
深入理解Java内存模型(四)——volatile
volatile 的特性当我们声明共享变量为 volatile 后,对这个变量的读 / 写将会很特别。理解 volatile 特性的一个好方法是:把对 volatile 变量的单个读 / 写,看成是使用同一个监视器锁对这些单个读 / 写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile ...转载 2013-06-04 10:02:35 · 624 阅读 · 0 评论 -
深入理解Java内存模型(三)——顺序一致性
数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java 内存模型规范对数据竞争的定义如下:在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM 对正确同步的多线程程序的内存一致性做...转载 2013-06-04 10:00:57 · 701 阅读 · 0 评论 -
Java多线程-工具篇-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而转载 2013-01-17 11:02:16 · 873 阅读 · 0 评论