
Java
Java
siriusol
这个作者很懒,什么都没留下…
展开
-
Java ConcurrentHashMap
ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。底层数据结构JDK1.7 的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟 HashMap1.8 的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;实现线程安全的方式① 在 JDK原创 2020-06-01 19:42:51 · 256 阅读 · 0 评论 -
Java HashSet
HashSet 中有一个 HashMap:private transient HashMap<E,Object> map;HashSet 是按照 hash 算法来存储元素的,因此具有很好的存取和查找性能。特点不能保证元素的顺序。HashSet 不是线程同步的,如果多线程操作 HashSet 集合,则应通过代码来保证其同步。集合元素值可以是 null。存储原理当向 HashSet 集合存储一个元素时,HashSet 会调用该对象的 hashCode() 方法得到其 hashC原创 2020-06-01 19:41:44 · 141 阅读 · 0 评论 -
Java JVM 垃圾回收
参考链接:https://www.cnblogs.com/1024Community/p/honery.html#%E4%B8%80----%E6%8A%80%E6%9C%AF%E8%83%8C%E6%99%AF%E4%BD%A0%E8%A6%81%E4%BA%86%E8%A7%A3%E5%90%A7JVM 的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,因为方法结束或者原创 2020-05-31 18:33:07 · 226 阅读 · 0 评论 -
Java 并发 AQS
转载于:https://snailclimb.gitee.io/javaguide/#/docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions?id=_6-aqshttps://cyc2018.github.io/CS-Notes/#/notes/Java%20%E5%B9%B6%E5%8F%91?id=%e4%b8%83%e3%80%81juc-aqs](https://cyc2018.github.io/CS-Not转载 2020-05-31 12:52:59 · 170 阅读 · 0 评论 -
Java 对象操作
序列化序列化就是将一个对象转换成字节序列,方便存储和传输。序列化:ObjectOutputStream.writeObject()反序列化:ObjectInputStream.readObject()不会对静态变量进行序列化,因为序列化只是保存对象的状态,静态变量属于类的状态。Serializable序列化的类需要实现 Serializable 接口,它只是一个标准,没有任何方法需要实现,但是如果不去实现它的话而进行序列化,会抛出异常。public static void main(Str原创 2020-05-31 12:45:37 · 269 阅读 · 0 评论 -
Java ThreadLocal
参考:https://snailclimb.gitee.io/javaguide/#/docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions?id=_3-threadlocal另:https://cyc2018.github.io/CS-Notes/#/notes/Java 并发?id=_2-线程本地存储(thread-local-storage)通常情况下,创建的变量是可以被任何一个线程访问并修改的。如果想实现每一原创 2020-05-31 12:35:38 · 134 阅读 · 0 评论 -
Java 线程池
线程池可以限制和管理资源(包括执行一个任务)。每个线程池还维护一些基本统计信息,例如已完成任务的数量。池化技术线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用原创 2020-05-31 12:32:15 · 161 阅读 · 0 评论 -
Java 异常处理
图片来自:https://simplesnippets.tech/exception-handling-in-java-part-1/图片来自:https://chercher.tech/java-programming/exceptions-java在 Java 中,所有的异常都有一个共同的祖先: java.lang 包中的 Throwable 类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量.原创 2020-05-31 12:30:02 · 161 阅读 · 0 评论 -
Java 故障处理工具
jpsJVM Process Status Tool,虚拟机进程状况工具。除了名字像 UNIX 的 ps 命令之外,它的功能也和 ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类 (Main Class,main() 函数所在的类) 名称以及这些进程的本地虚拟机唯一 ID (LVMID,Local Virtual Machine Identifier)。其他的 JDK 工具大多需要输入它查询到的 LVMID 来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID 与操作原创 2020-05-26 22:46:47 · 282 阅读 · 0 评论 -
Java 随机数
Java 中产生随机数的方法主要有 3 种:new Random()Math.random()System.currentTimeMillis() 取模java.util.Random 类是一个随机数发生器,构造函数有两个,Random() 和 Random(long seed)。第一个就是以当前时间为默认种子,第二个是以指定的种子值进行。产生之后,借助不同的语句产生不同类...原创 2020-05-05 13:48:41 · 370 阅读 · 0 评论 -
Java Lambda
Lambda 表达式描述了一个代码块(或者叫匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。考虑下面这段代码:() -> System.out.println("Lambda")() 为 Lambda 表达式的参数列表(本例中没有参数),-> 标识这串代码为 Lambda 表达式,System.out.println("Lambda")为要执行的代码,即将“输...原创 2020-04-17 20:53:41 · 157 阅读 · 0 评论 -
Java PriorityQueue
PriorityQueue 一个基于优先级的无界优先级队列。内部使用 Object 数组实现,默认大小是 11。PriorityQueue 通过二叉小顶堆实现,具体说是通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值)优先级队列的元素按照其自然顺序(从小到大)进行排序,或者根据构造队列时提供的 Comparator 进...原创 2020-04-06 13:21:54 · 235 阅读 · 0 评论 -
Java Atomic 原子类
atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下,如下图所示:根据操作的数据类型,可以将 JUC 包中的原子类分为 4 类:基本类型使用原子的方式更新基本...原创 2020-03-30 16:54:07 · 304 阅读 · 0 评论 -
Java 类加载器
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:引导类加载器(bootstrap class loader)用来加载 Java 的核心库,是用原生代码 C++ 实现,在 java 里无法获取,并不继承自 java.lang.ClassLoader。主要负责 jdk_home/lib 目录下的核心 api...原创 2020-03-27 15:37:46 · 143 阅读 · 0 评论 -
Java JVM OOM
转载于:https://www.jianshu.com/p/8be0daac8dc21. Java 堆空间发生可能性:高造成原因无法在 Java 堆中分配对象吞吐量增加应用程序无意中保存了对象引用,对象无法被 GC 回收应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用,有时 finalizer 线...转载 2020-03-26 21:02:57 · 158 阅读 · 0 评论 -
Java 引用
强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o = new Object(); // 强引用当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下:o...转载 2020-03-26 11:13:24 · 123 阅读 · 0 评论 -
Java 并发 J.U.C locks 包
java.util.concurrent.locks 包结构如下:Lock在Lock接口出现之前,java程序主要是靠synchronized关键字实现锁功能的,而java SE5之后,并发包中增加了lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性,可中断的获取锁以及超时获取锁等多...原创 2020-03-25 19:20:09 · 194 阅读 · 0 评论 -
Java 并发 synchronized 的缺陷
synchronized 是 java 中的一个关键字,是 Java 语言内置的特性。如果一个代码块被 synchronized 修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:获取锁的线程执行完了该代码块,然后线程释放对锁的占有;线程执行发生异常,此时 JVM 会让线程自动释放锁。那么...原创 2020-03-25 19:10:50 · 482 阅读 · 1 评论 -
Java 锁
可重入锁如果锁具备可重入性,则称作为可重入锁。像 synchronized 和 ReentrantLock 都是可重入锁,可重入性实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个 synchronized 方法时,比如说 method1(),而在 method1() 中会调用另外一个 synchronized 方法 method2(),此...转载 2020-03-25 19:04:16 · 117 阅读 · 0 评论 -
Java TreeSet
TreeSet 是基于 TreeMap 实现的。TreeSet 中含有一个 NavigableMap 类型的成员变量 m,而 m 实际上是 TreeMap 的实例。TreeSet 是 SortedSet 接口的实现类,TreeSet 可以保证元素处于排序状态,它采用红黑树的数据结构来存储集合元素。TreeSet 支持两种排序方法:自然排序和定制排序,默认采用自然排序。自然排序TreeSet 会...原创 2020-03-23 12:11:56 · 231 阅读 · 0 评论 -
Java HashMap 和 Hashtable 区别
继承不同。public class Hashtable extends Dictionary implements Mappublic class HashMap extends AbstractMap implements MapHashtable 中的方法是同步的,而 HashMap 中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用 Hashtable,但是要使...原创 2020-03-23 11:31:40 · 1083 阅读 · 1 评论 -
Java 字符操作
编码与解码编码就是把字符转换为字节,而解码是把字节重新组合成字符。如果编码和解码过程使用不同的编码方式那么就出现了乱码。GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;UTF-16be 编码中,中文字符和英文字符都占 2 个字节。UTF-16be 中的 be 指的是 Big Endian,也就是大端...转载 2020-03-11 19:14:14 · 273 阅读 · 0 评论 -
Java 字节操作
实现文件复制public static void copyFile(String src, String dist) throws IOException { FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(dist); byte[] b...原创 2020-03-11 19:13:14 · 477 阅读 · 0 评论 -
Java Collections 工具类
导包:java.util.Collectionspublic static <T extends Comparable<? super T>> void sort(List list)对 list 进行排序public static void shuffle(List<?> list)对 list 进行随机排序public static &...原创 2020-03-10 22:27:36 · 150 阅读 · 0 评论 -
Java 先行发生原则
可以用 volatile 和 synchronized 来保证有序性。除此之外,JVM 还规定了先行发生原则,让一个操作无需控制就能先于另一个操作完成。1. 单一线程原则Single Thread rule在一个线程内,在程序前面的操作先行发生于后面的操作。2. 管程锁定规则Monitor Lock Rule一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。...转载 2020-03-09 19:39:55 · 515 阅读 · 0 评论 -
Java Arrays 工具类
导包:java.util.Arrays常用方法列表:public static void sort(Object[] a)对数组按照升序排序注:Object 泛指 7 种基本数据类型(没有boolean)public static void sort(Object[] a, Object fromIndex, Object toIndex)对数组元素指定范围进行排序,排序范围:...原创 2020-03-08 20:29:25 · 333 阅读 · 2 评论 -
Java 内存模型
Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。主内存与工作内存处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。所有的变量都存储在...转载 2020-03-07 21:17:15 · 177 阅读 · 0 评论 -
Java 基本数据类型
数据类型占用空间byte1字节short2字节char2字节(C语言中是1字节)可以存储一个汉字int4字节long8字节float4字节double8字节booleanfalse / true (理论上占用 1bit , 1/8 字节,实际处理按 1字节 处理)long → float 无须强制转换。...原创 2020-03-07 19:59:38 · 158 阅读 · 0 评论 -
Java 并发:J.U.C 组件
FutureTaskCallable 的 call() 方法有返回值,返回值通过 Future 进行封装。FutureTask 实现了 RunnableFuture 接口,该接口继承自 Runnable 和 Future 接口,这使得 FutureTask 既可以当做一个任务执行,也可以有返回值。public class FutureTask<V> implements Runna...原创 2020-03-07 17:24:03 · 229 阅读 · 0 评论 -
线程:状态
一个线程只能处于一种状态,并且这里的线程状态特指 Java 虚拟机的线程状态,不能反映线程在特定操作系统下的状态。新建(NEW)创建后尚未启动。可运行(RUNABLE)正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层操作系统的资源调度。阻塞(BL...原创 2020-03-07 15:23:06 · 160 阅读 · 0 评论 -
线程:协作
当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 join() 方法,b 线程会等待 a 线程结束才继续执行,因此最后能够保证 a 线程的输出先于 b 线程...原创 2020-03-07 14:55:22 · 151 阅读 · 0 评论 -
线程:互斥同步
Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock(可重入锁)。synchronized1. 同步一个代码块public void func() { synchronized (this) { // ... }}它只作用于同一个对象,如果...原创 2020-03-07 14:17:48 · 276 阅读 · 0 评论 -
线程:中断
一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。InterruptedException通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。对于以下代码,在 main() 中启动...转载 2020-03-07 14:13:55 · 166 阅读 · 0 评论 -
线程:基础机制
ExecutorExecutor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。主要有三种 Executor:CachedThreadPool:一个任务创建一个线程;FixedThreadPool:所有任务只能使用固定大小的线程;SingleThreadExecutor:相当于大小为 1 的 FixedThrea...原创 2020-03-07 14:13:02 · 148 阅读 · 0 评论 -
线程:基础知识
使用线程有三种使用线程的方法:实现 Runnable 接口;实现 Callable 接口;继承 Thread 类。实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以理解为任务是通过线程驱动从而执行的。实现 Runnable 接口需要实现接口中的 run() 方法。publ...原创 2020-03-06 23:03:39 · 185 阅读 · 0 评论 -
Java HashMap
HashMap 存储的是 key-value 的键值对,允许 key 为 null,也允许 value 为 null。HashMap 内部为数组 + 链表的结构,会根据 key 的 hashCode 值来确定数组的索引(确认放在哪个桶里),如果发生hash冲突,HashMap 会将同一个桶中的数据以链表的形式存储,但是如果发生hash冲突的概率比较高,就会导致同一个桶中的链表长度过长,遍历效率降...转载 2020-03-03 20:41:36 · 182 阅读 · 0 评论 -
Java fail-fast
fail-fast 机制,即快速失败机制,是 java 集合( Collection )中的一种错误检测机制。当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生 fail-fast,即抛出 ConcurrentModificationException 异常。fail-fast 机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅用于检测 bug。...转载 2020-03-03 18:21:28 · 147 阅读 · 0 评论 -
Java BIO NIO AIO
Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。同步与异步同步: 同步就是发起一个调用后,被调用者未处理完请求之...转载 2020-02-19 22:41:15 · 423 阅读 · 0 评论 -
Java 单例模式实现
饿汉式线程安全,调用效率高,但是不能延时加载。public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance(){ retu...原创 2020-02-19 19:20:48 · 3209 阅读 · 2 评论 -
Java 悲观锁与乐观锁
悲观锁总是假设最坏的情况,悲观锁认为被它保护的数据是极其不安全的,每时每刻都有可能变动,一个事务拿到悲观锁后(可以理解为一个用户),其他任何事务都不能对该数据进行修改,只能等待锁被释放才可以执行。当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(又名...原创 2020-02-19 17:24:41 · 1206 阅读 · 0 评论