![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
worldchinalee
这个作者很懒,什么都没留下…
展开
-
SocketChannel---各种注意点
SocketChannel---各种注意点转载 2020-09-20 20:47:30 · 412 阅读 · 0 评论 -
Java NIO之Selector(选择器)
一 Selector(选择器)介绍Selector一般称 为选择器,当然你也可以翻译为多路复用器。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。使用Selector的好处在于:使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。二 Selector(选择器)的使用方法介绍1. Selector的创建通过...转载 2020-09-20 17:18:37 · 486 阅读 · 0 评论 -
Java NIO 之 Channel(通道)
一 Channel(通道)介绍通常来说NIO中的所有IO都是从 Channel(通道) 开始的。 从通道进行数据读取:创建一个缓冲区,然后请求通道读取数据。 从通道进行数据写入:创建一个缓冲区,填充数据,并要求通道写入数据。 数据读取和写入操作图示:Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以写,流一般来说是单向的(只能读或者写,所以之前我们用流进行IO操作的时候需要分别创建一个输入流和一个输出流)。 通道可以异..转载 2020-09-20 17:12:56 · 511 阅读 · 0 评论 -
Java NIO 之 Buffer(缓冲区)
一 Buffer(缓冲区)介绍Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels.Buffer本质上就是一块内存区,可以用来写入数据,并在稍后读取出来。这块内存被NIO Buffer包裹起来,对外提供一系列的读写方便开发的接口。在Java NIO中使用的核心缓冲区如下(覆盖了通过I/O发送的基本数据类型:byte, char、short, int, long, float, double转载 2020-09-20 16:58:04 · 282 阅读 · 0 评论 -
Java NIO 概览
一 NIO简介Java NIO 是 java 1.4 之后新出的一套IO接口,这里的的新是相对于原有标准的Java IO和Java Networking接口。NIO提供了一种完全不同的操作方式。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 随着JDK 7的推出,NIO系统得到了扩展,为文件系统功能和文件处理提供了增强的支持。 由于NIO文件类支持的这些新的功能,NIO被广泛应用于文件处理。二 NIO的特性/NIO与IO区别转载 2020-09-20 16:43:08 · 91 阅读 · 0 评论 -
NIO的写操作分析
很多人对NIO的写操作理解的不深,不知道为什么要注册写事件,何时注册写事件,为什么写完之后要取消注册写事件。Selector.isWriteable()方法监控的是内核的写缓冲器是否可写,所以除非内核的写缓冲区满了,否则一旦一个SocketChannel注册了写事件,每次selector都会选中这个SocketChannel,进入到isWriteable()分支中去。实际上服务器端写消息时完全可以不注册写事件,直接调用SocketChannel.write(ByteBuffer),也能把数据写.转载 2020-09-20 16:07:26 · 295 阅读 · 0 评论 -
万字超强图文讲解 AQS 以及 ReentrantLock 应用
Java SDK 为什么要设计 Lock曾几何时幻想过,如果 Java 并发控制只有 synchronized 多好,只有下面三种使用方式,简单方便publicclassThreeSync{privatestaticfinalObjectobject=newObject();publicsynchronizedvoidnormalSyncMethod(){//临界区}publicstaticsynchronizedvoidstaticS...转载 2020-06-10 15:43:00 · 233 阅读 · 0 评论 -
IDEA远程debug java项目
远程debug调试:服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。步骤1、远程服务器上项目需以debug模式启动,在启动命令中加入参数-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,serve...转载 2020-01-03 16:40:00 · 758 阅读 · 0 评论 -
深入理解SPI机制
一、什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。1、小栗子首先,我们需要定义一个接口...转载 2019-11-21 11:18:06 · 167 阅读 · 0 评论 -
JVM之类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成字节码(.class 文件)。 类加载器...转载 2019-11-21 10:18:38 · 98 阅读 · 0 评论 -
类加载的原则
Java类加载器的作用就是在运行时加载类。Java类加载器基于三个机制:委托、可见性和单一性。委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类 加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。正确理...转载 2019-11-20 16:58:54 · 503 阅读 · 0 评论 -
ScheduledThreadPoolExecutor执行周期性任务异常
1.问题描述在使用ScheduledThreadPoolExecutor的时候,可以用来周期性地执行任务。但是不知道什么原因,发现过一段时间任务不执行了。2.解决思路使用jstack命令先看一下进程的状态:"scheduled-pool-0" #11 prio=5 os_prio=0 tid=0x000000001c370800 nid=0x31bc waiting on co...原创 2019-10-16 17:19:04 · 2098 阅读 · 0 评论 -
Java8 HashMap之tableSizeFor
Java8对许多内置的容器进行了优化与拓展,其中对HashMap的改变尤其大。之后将进行总结。 最近在看HashMap的源码时,发现了里面好多很不错的算法,相比Java7从性能上提高了许多。其中tableSizeFor就是一个例子。tableSizeFor的功能(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。该算法源码如下:static f...转载 2019-09-19 15:08:52 · 98 阅读 · 0 评论 -
深入理解单例模式:静态内部类单例原理
本文主要介绍java的单例模式,以及详细剖析静态内部类之所以能够实现单例的原理。OK,废话不多说,进入正文。首先我们要先了解下单例的四大原则:构造方法私有。 以静态方法或者枚举返回实例。 确保实例只有一个,尤其是多线程环境。 确保反序列化时不会重新构建对象。看一下静态内部类的单例模式的代码:public class Singleton05 { private Sing...转载 2019-09-19 09:43:59 · 325 阅读 · 0 评论 -
总结单例模式的几种实现方式及优缺点
几种创建方式总结:1、饿汉式:类初始化的时候,会立即加载该对象,线程天生安全,调用效率高。2、懒汉式:类初始化时,不会初始化该对象,真正需要使用的时候才会去创建该对象,具备懒加载功能。3、双重检测方式(因为JVM本身重排序的原因,可能会出现多次的初始化)4、枚举单例:使用枚举实现单例模式,实现简单、调用效率高,枚举本身就是单例,由JVM从根本上提供保障,避免通过反射和反序列化的漏洞...原创 2019-09-18 10:41:32 · 1425 阅读 · 0 评论 -
分析 java 占用 cpu 过高的原因以及 java ScheduledThreadPoolExecutor bug 介绍
近期发现一个java进程的cpu占用接近100%。开始简单地认为是由于给java分配的内存不足,从而导致频繁GC。于是首先的处理方式就是直接给该java程序分配更多的内存,然而进程启动没几分钟,cpu占用再次接近100%,看来问题没这么简单。一. 分析 java 占用 cpu 过高的原因1. 通过top命令直接查到该java进程的进程ID,可以看到进程ID为26260。...转载 2019-08-31 11:37:41 · 1760 阅读 · 0 评论 -
Java线程池架构原理和源码解析(ThreadPoolExecutor)
在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:《java之JUC系列-外部Tools》中第一部分有详细的说明,请参阅;文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,...转载 2018-03-07 20:58:37 · 96 阅读 · 0 评论 -
JVM内存不要超过32G
不要超过32G事实上jvm在内存小于32G的时候会采用一个内存对象指针压缩技术。 在java中,所有的对象都分配在堆上,然后有一个指针引用它。指向这些对象的指针大小通常是CPU的字长的大小,不是32bit就是64bit,这取决于你的处理器,指针指向了你的值的精确位置。 对于32位系统,你的内存最大可使用4G。对于64系统可以使用更大的内存。但是64位的指针意味着更大的浪费,因为你的指针本身大了。浪...转载 2018-03-01 16:26:30 · 7530 阅读 · 2 评论 -
Spring 中配置log4j日志功能
一,添加log4j依赖包可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包 二,创建 log4j.properties 配置文件log4j.properties配置文件用来配置 日志的输出格式、输出的地址....### set log levels ###log4j.rootLogger = INFO, D, Elog4j.appender.D ...转载 2018-04-17 10:53:54 · 117 阅读 · 0 评论 -
Java使用wait和notify实现生产者和消费者
1. 使用注意事项永远在synchronized的函数或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成IllegalMonitorStateException。 永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。 永远在多线程间共享的对象上使用wait。 noti...转载 2018-11-06 11:33:51 · 1144 阅读 · 0 评论 -
java多线程wait时为什么要用while而不是if
对于java多线程的wait()方法,我们在jdk1.6的说明文档里可以看到这样一段话 从上面的截图,我们可以看出,在使用wait方法时,需要使用while循环来判断条件十分满足,而不是if,那么我们思考以下,如果使用if会怎么样?为方便讲解,我们来看一个被广泛使用的生产消费的例子。代码部分参考 郝斌java视频教程 部分改编。/* 生产和消费*/packag...转载 2018-11-06 17:44:52 · 10288 阅读 · 14 评论 -
Java中的线程状态
说到线程,一定要谈到线程状态,不同的状态说明线程正处于不同的工作机制下,不同的工作机制下某些动作可能对线程产生不同的影响。 Java语言定义了6中状态,而同一时刻,线程有且仅有其中的一种状态。要获取Java线程的状态可以使用 java.lang.Thread类中定义的 getState()方法,获取当前线程的状态就可以使用Thread.currentThread().getSta...转载 2018-11-02 16:55:41 · 284 阅读 · 0 评论 -
jstack使用
一、介绍jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:jstack [-l] pid 主要分为两个功能: a. 针对活着的进程做本地的或远程的线程dump; ...转载 2018-11-05 16:42:54 · 754 阅读 · 0 评论 -
Java 线程wait()之后一定要notify()才能唤醒吗?
研究这个问题之前先要搞清楚线程有哪些状态?1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被...转载 2018-11-05 16:46:17 · 2623 阅读 · 0 评论 -
Java Socket设置timeout几种常用方式总结
原文链接:https://my.oschina.net/shipley/blog/715196摘要: Java的网络编程Socket常常用于各种网络工具,比如数据库的jdbc客户端,redis客户端jedis,各种RPC工具java客户端,这其中存在一些参数来配置timeout,但是之前一直对timeout的理解还不清晰,所以会导致使用这些网络工具的时候有点迷茫。在此做个总结。...转载 2019-07-14 11:25:57 · 14072 阅读 · 0 评论 -
guava-19.0和google-collections-1.0 的 ImmutableSet 类冲突
guava-19.0 google-collections-1.0 都有 ImmutableSet 类,包路径也一致,前者有 copyOf(Collection)?一、应用报错:二、解决办法configurations.all { exclude module: 'logback-core' exclude module: 'logback-classic'...转载 2019-08-03 15:05:19 · 818 阅读 · 2 评论 -
原码,反码,补码杂谈
本文从原码讲起。通过简述原码,反码和补码存在的作用,加深对补码的认识。力争让你对补码的概念不再局限于:负数的补码等于反码加一。接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨。每次都是在课本的最前几页,来上这么一段:什么反码是原码除符号位,按位取反。补码等于反码加一。然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系。我原来也是看了好几遍都没看...转载 2019-08-27 09:52:06 · 137 阅读 · 0 评论 -
可重入锁和不可重入锁
锁的简单应用用lock来保证原子性(this.count++这段代码称为临界区)什么是原子性,就是不可分,从头执行到尾,不能被其他线程同时执行。可通过CAS来实现原子操作CAS(Compare and Swap):CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。CAS主要通过compareA...转载 2018-03-07 20:30:49 · 194 阅读 · 0 评论