Java
tugangkai
四海皆为兄弟
展开
-
javavisualvm连接远程jvm方式及问题
1.如何开启jmx连接远程vm需要让远程vm启动时加入如下参数:-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false2.为什么java visualvm连接不上远程java虚拟机jm...原创 2020-04-15 10:01:44 · 850 阅读 · 0 评论 -
Function接口的使用
Java8 添加了一个新的特性Function,顾名思义这一定是一个函数式的操作。我们知道Java8的最大特性就是函数式接口。所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上。标注了@FunctionalInterface的接口有很多,但此篇我们主要讲Function,了解了Function其他的操作也就很...转载 2020-01-15 15:39:13 · 1895 阅读 · 0 评论 -
Future模式之CompletableFuture
CompletableFuture 是Java 8 新增加的Api,该类实现,Future和CompletionStage两个接口,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。一、主动完成计算public T get()该方法为阻塞方法,会等待...转载 2020-01-14 22:01:01 · 223 阅读 · 0 评论 -
线程池的各种使用场景
(1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换(2)并发不高、任务执行时间长的业务要区分开看:a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1...转载 2020-01-07 16:34:18 · 543 阅读 · 0 评论 -
Java中的Future
1.Future解决了什么问题Future是java中的一个接口,主要用于java多线程计算过程的异步结果获取,能够感知计算的进度,与传统的多线程实现方式,比如继承Thread类,实现runnable接口,它们主要的局限在于对多线程运行的本身缺少监督。2.Callable接口和Runnable接口区别下面是它们之间的主要区别:runable接口是用run方法作为线程运行任务的入口,cal...原创 2019-12-27 17:28:58 · 8458 阅读 · 1 评论 -
Java序列化
我们在将对象保存到文件时,使用的是DataOutputStream,从文件读入对象时,使用的是DataInputStream, 使用它们,需要逐个处理对象中的每个字段,我们提到,这种方式比较啰嗦,Java中有一种更为简单的机制,那就是序列化。简单来说,序列化就是将对象转化为字节流,反序列化就是将字节流转化为对象。在Java中,具体如何来使用呢?它是如何实现的?有什么优缺点?本节就来探讨这些问题...转载 2019-02-24 22:24:35 · 93 阅读 · 0 评论 -
Java并发总结
多线程开发有两个核心问题,一个是竞争,另一个是协作。竞争会出现线程安全问题,所以,本节首先总结线程安全的机制,然后是协作的机制。管理竞争和协作是复杂的,所以Java提供了更高层次的服务,比如并发容器类和异步任务执行服务,我们也会进行总结。本节纲要如下:线程安全的机制 线程的协作机制 容器类 任务执行服务线程安全的机制线程表示一条单独的执行流,每个线程有自己的执行计数器,有自己的栈,...转载 2019-02-23 18:28:51 · 102 阅读 · 0 评论 -
java序列化与反序列化
序列化与反序列化序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。Java对象的序列化与反序列化在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收...转载 2019-02-18 18:03:52 · 75 阅读 · 0 评论 -
String比较中的=与equals方法
我们先看代码String str1 = new String("hello");String str2 = "hello"; System.out.println("str1==str2: " + (str1==str2)); \\1System.out.println("str1.equals(str2): " + str1.equals(str2)); \\2输出结果:st...原创 2019-02-18 21:03:51 · 294 阅读 · 0 评论 -
Java线程状态及其转移
说到线程,一定要谈到线程状态,不同的状态说明线程正处于不同的工作机制下,不同的工作机制下某些动作可能对线程产生不同的影响。 Java语言定义了6中状态,而同一时刻,线程有且仅有其中的一种状态。要获取Java线程的状态可以使用 java.lang.Thread类中定义的 getState()方法,获取当前线程的状态就可以使用Thread.currentThread().getState...转载 2019-02-18 21:58:04 · 2185 阅读 · 0 评论 -
AbstractQueuedSynchronizer的介绍和原理分析
目录 简介API说明示例实现分析public final void acquire(int arg)public final boolean release(int arg)protected boolean tryAcquire(int arg)public final void acquireInterruptibly(int arg)private b...转载 2019-02-18 23:39:52 · 107 阅读 · 0 评论 -
二进制文件和字节流
本节我们介绍在Java中如何以二进制字节的方式来处理文件,上节我们提到Java中有流的概念,以二进制方式读写的主要流有:InputStream/OutputStream: 这是基类,它们是抽象类。 FileInputStream/FileOutputStream: 输入源和输出目标是文件的流。 ByteArrayInputStream/ByteArrayOutputStream: 输入源和...转载 2019-02-24 16:40:34 · 7109 阅读 · 0 评论 -
并发同步协作工具
Java并发包中有一些专门的同步工具类,本节,我们就来探讨它们。我们要探讨的工具类包括:读写锁ReentrantReadWriteLock 信号量Semaphore 倒计时门栓CountDownLatch 循环栅栏CyclicBarrier 与71节介绍的显示锁和72节介绍的显示条件类似,它们也都是基于AQS实现的,AQS可参看71节。在一些特定的同步协作场景中,相比使用最基本的w...转载 2019-02-23 17:52:43 · 260 阅读 · 0 评论 -
Java定时任务
本节探讨定时任务,定时任务的应用场景是非常多的,比如:闹钟程序或任务提醒,指定时间叫床或在指定日期提醒还信用卡 监控系统,每隔一段时间采集下系统数据,对异常事件报警 统计系统,一般凌晨一定时间统计昨日的各种数据指标在Java中,有两种方式实现定时任务:使用java.util包中的Timer和TimerTask 使用Java并发包中的ScheduledExecutorService...转载 2019-02-23 16:56:38 · 507 阅读 · 0 评论 -
方便的CompletionService
我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供了一个方便的方法,使用CompletionService,这是一个接口,它的实现类是ExecutorCompletionService,本节我们就来探讨它们。基本用法接口和类定义与77节介绍的ExecutorService一样,...转载 2019-02-23 15:43:24 · 163 阅读 · 0 评论 -
Java线程池
上节,我们初步探讨了Java并发包中的任务执行服务,实际中,任务执行服务的主要实现机制是线程池,本节,我们就来探讨线程池。基本概念线程池,顾名思义,就是一个线程的池子,里面有若干线程,它们的目的就是执行提交给线程池的任务,执行完一个任务后不会退出,而是继续等待或执行新任务。线程池主要由两个概念组成,一个是任务队列,另一个是工作者线程,工作者线程主体就是一个循环,循环从队列中接受任务并执行,...转载 2019-02-23 15:32:10 · 134 阅读 · 0 评论 -
异步任务执行服务
Java并发包提供了一套框架,大大简化了执行异步任务所需的开发,本节我们就来初步探讨这套框架。在之前的介绍中,线程Thread既表示要执行的任务,又表示执行的机制,而这套框架引入了一个"执行服务"的概念,它将"任务的提交"和"任务的执行"相分离,"执行服务"封装了任务执行的细节,对于任务提交者而言,它可以关注于任务本身,如提交任务、获取结果、取消任务,而不需要关注任务执行的细节,如线程创建、任...转载 2019-02-23 15:22:26 · 236 阅读 · 0 评论 -
java 锁的类型
读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多...原创 2019-02-23 00:57:09 · 90 阅读 · 0 评论 -
并发容器 - 各种队列
本节,我们来探讨Java并发包中的各种队列。Java并发包提供了丰富的队列类,可以简单分为:无锁非阻塞并发队列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞队列:基于数组的ArrayBlockingQueue,基于链表的LinkedBlockingQueue和LinkedBlockingDeque 优先级阻塞队列:PriorityBloc...转载 2019-02-22 01:32:59 · 113 阅读 · 0 评论 -
ConcurrentHashMap总结
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,f...转载 2019-02-22 00:05:04 · 143 阅读 · 0 评论 -
JAVA HASHMAP的死循环
问题最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题,虽然网上分析的文章很多,还是觉得有必须写一篇文章,让关注我公众号的同学能够意识到这个问题,并了解这个死循环是如何产生的。...转载 2019-02-21 21:47:24 · 153 阅读 · 0 评论 -
文本文件和字符流
我们提到,对于文本文件,字节流没有编码的概念,不能按行处理,使用不太方便,更适合的是使用字符流,本节就来介绍字符流。我们首先简要介绍下文本文件的基本概念、与二进制文件的区别、编码、以及字符流和字节流的区别,然后我们介绍Java中的主要字符流,它们有:Reader/Writer:字符流的基类,它们是抽象类。 InputStreamReader/OutputStreamWriter:适配器类...转载 2019-02-24 17:54:11 · 519 阅读 · 0 评论 -
文件和目录操作
文件和目录操作最终是与操作系统和文件系统相关的,不同系统的实现是不一样的,但Java中的java.io.File类提供了统一的接口,底层它会通过本地方法调用操作系统和文件系统的具体实现,本节,我们就来介绍File类。File类中的操作大概可以分为三类:文件元数据 文件操作 目录操作 在介绍这些操作之前,我们先来看下File的构造方法。构造方法File既可以表示文件,也可以表示...转载 2019-02-24 20:02:03 · 269 阅读 · 0 评论 -
ThreadPoolExecutor线程池源码解读
ThreadPoolExecutorThreadPoolExecutor是Java线程工具类的基础,通过调整它的内置参数可以定制各种用途的线程池,线程池主要解决两个问题:可以在执行大量异步任务的时候提供高性能,如果没有线程池,那么就会产生这样一种情况,一个线程执行一个任务,线程的生命周期中包括了创建和销毁阶段,大量的创建线程和销毁线程无疑占用了大量的CPU时间以及系统资源,有了线程池,可以让线...原创 2019-09-03 20:18:58 · 163 阅读 · 0 评论 -
EnumSet详细讲解
之前介绍的Set接口的实现类HashSet/TreeSet,它们内部都是用对应的HashMap/TreeMap实现的,但EnumSet不是,它的实现与EnumMap没有任何关系,而是用极为精简和高效的位向量实现的,位向量是计算机程序中解决问题的一种常用方式,我们有必要理解和掌握。除了实现机制,EnumSet的用法也有一些不同。次外,EnumSet可以说是处理枚举类型数据的一把利器,在一些应用领...转载 2019-04-28 09:59:24 · 3284 阅读 · 1 评论 -
神奇的堆
前面几节介绍了Java中的基本容器类,每个容器类背后都有一种数据结构,ArrayList是动态数组,LinkedList是链表,HashMap/HashSet是哈希表,TreeMap/TreeSet是红黑树,本节介绍另一种数据结构 - 堆。引入堆之前我们提到过堆,那里,堆指的是内存中的区域,保存动态分配的对象,与栈相对应。这里的堆是一种数据结构,与内存区域和分配无关。堆是什么结构呢?这...转载 2019-02-21 13:19:06 · 276 阅读 · 0 评论 -
基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)
我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序。由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容器。当然,jdk 中也为我们提供了基于红黑树的存储的 TreeMap 容器,它的内部元素是有序的,但是由于它内部通过红黑结点的各种变换来维持二叉搜索树的平衡,相对复杂,并且在并发环境下碍于 rebal...转载 2019-02-20 16:12:48 · 188 阅读 · 0 评论 -
解析TreeSet
我们提到,HashSet有一个重要局限,元素之间没有特定的顺序,我们还提到,Set接口还有另一个重要的实现类TreeSet,它是有序的,与HashSet和HashMap的关系一样,TreeSet是基于TreeMap的,上节我们介绍了TreeMap,本节我们来详细讨论TreeSet。下面,我们先来看TreeSet的用法,然后看实现原理,最后总结分析TreeSet的特点。基本用法构造方法...转载 2019-02-20 15:31:25 · 237 阅读 · 0 评论 -
将数组转换成集合Arrays.asList,不可进行add和remove操作的原因
直接上代码:import java.util.Arrays;import java.util.List; public class Test { public static void main(String[] args) { Integer a[] = {1,2,5,6,9}; List<Integer> list = Arra...转载 2019-02-20 15:19:28 · 148 阅读 · 0 评论 -
HashSet运用及原理
上节介绍了HashMap,提到了Set接口,Map接口的两个方法keySet和entrySet返回的都是Set,本节,我们来看Set接口的一个重要实现类HashSet。与HashMap类似,字面上看,HashSet由两个单词组成,Hash和Set,Set表示接口,实现Set接口也有多种方式,各有特点,HashSet实现的方式利用了Hash。下面,我们先来看HashSet的用法,然后看实现原...转载 2019-02-20 02:27:45 · 480 阅读 · 0 评论 -
HashMap运用及原理
前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用?是如何实现的?本节详细介绍。字面上看,HashMap由两个单词组成,Hash和Map,这里Map不是地图的意思,而是表示映射关系,是一个接口,实现Map接口有多种方式,HashMap实现的方式利用...转载 2019-02-20 02:20:54 · 195 阅读 · 0 评论 -
解析LinkedList
上节我们介绍了ArrayList,ArrayList随机访问效率很高,但插入和删除性能比较低,我们提到了同样实现了List接口的LinkedList,它的特点与ArrayList几乎正好相反,本节我们就来详细介绍LinkedList。除了实现了List接口外,LinkedList还实现了Deque和Queue接口,可以按照队列、栈和双端队列的方式进行操作,本节会介绍这些用法,同时介绍其实现原理...转载 2019-02-20 02:08:53 · 167 阅读 · 0 评论 -
解析ArrayList
我们先来看它的基本用法。基本用法新建ArrayListArrayList是一个泛型容器,新建ArrayList需要实例化泛型参数,比如:ArrayList<Integer> intList = new ArrayList<Integer>();ArrayList<String> strList = new ArrayList<Stri...转载 2019-02-20 01:58:05 · 290 阅读 · 0 评论 -
Java集合类: Set、List、Map、Queue使用场景梳理
本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景相关学习资料http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F%E5%8F%8Ajava%E9%9B%86%E5%90%88%E7%B1%BB%E8%AF%A6%E8%A7%A3%28collection%E3%80%81...转载 2019-02-20 01:15:53 · 112 阅读 · 0 评论 -
常见文件类型处理: 属性文件/CSV/EXCEL/HTML/压缩文件
在日常编程中,我们还经常会需要处理一些具体类型的文件,如CSV, Excel, HTML,直接使用前面几节介绍的方式来处理一般是很不方便的,往往有一些第三方的类库,基于之前介绍的技术,提供了更为方便易用的接口。本节,我们就来简要介绍如何利用Java SDK和一些第三方类库,来处理如下五种类型的文件:属性文件:属性文件是常见的配置文件,用于在不改变代码的情况下改变程序的行为。 CSV:CS...转载 2019-02-25 01:09:27 · 1087 阅读 · 0 评论 -
内存映射文件及其应用 - 实现一个简单的消息队列
本节介绍内存映射文件,内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持。我们先来介绍内存映射文件的基本概念,它是什么,能解决什么问题,然后我们介绍如何在Java中使用,我们会设计和实现一个简单的、持久化的、跨程序的消息队列来演示内存映射文件的应用。基本概念所谓内存映射文件,就是将文件映射到内存,文件对应于内存中的一个字节数组,对文件的操作变为对这个字...转载 2019-02-24 21:58:12 · 463 阅读 · 0 评论 -
随机读写文件及其应用 - 实现一个简单的KV数
Java中还有一个类RandomAccessFile,它没有这两个限制,既可以读,也可以写,还可以随机读写,它是一个更接近于操作系统API的封装类。本节,我们介绍就来介绍这个类,同时,我们介绍它的一个应用,实现一个简单的键值对数据库,怎么实现数据库呢?我们先来看RandomAccessFile的用法。RandomAccessFile构造方法RandomAccessFile有如下构造...转载 2019-02-24 20:51:52 · 412 阅读 · 0 评论 -
并发容器 - 写时拷贝的List和Set
本节以及接下来的几节,我们探讨Java并发包中的容器类。本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理。它们的用法比较简单,我们需要理解的是它们的实现机制,Copy-On-Write,即写时拷贝或写时复制,这是解决并发问题的一种重要思路。CopyOnWriteArrayList基本用法CopyOnWrit...转载 2019-02-21 20:59:26 · 292 阅读 · 0 评论 -
显式条件
上节我们介绍了显式锁,本节介绍关联的显式条件,介绍其用法和原理。显式条件也可以被称做条件变量、条件队列、或条件,后文我们可能会交替使用。用法基本概念和方法锁用于解决竞态条件问题,条件是线程间的协作机制。显式锁与synchronzied相对应,而显式条件与wait/notify相对应。wait/notify与synchronized配合使用,显式条件与显式锁配合使用。条件与锁相关联,...转载 2019-02-21 20:38:31 · 134 阅读 · 0 评论 -
java静态分派与动态分派
方法调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,但是Class文件的编译过程不包括传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相对于之前说的直接引用)。这个特性给Java带来了更强大的动态...转载 2018-03-08 23:55:50 · 157 阅读 · 0 评论