自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 Java Atomic 原子类

atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下,如下图所示:根据操作的数据类型,可以将 JUC 包中的原子类分为 4 类:基本类型使用原子的方式更新基本...

2020-03-30 16:54:07 278

原创 Linux $ 符号

$ 符号变量解释$$Shell 本身的PID(ProcessID)$!Shell 后台运行的最后一个进程的 PID$?上个命令的结束代码(返回值),成功是0,不成功是1。$*所有参数列表。如"$*“用「”」括起来的情况,就是以"$1 $2 … $n"的形式输出所有参数。$@所有参数列表。如"$@“用「”」括起来的情况,就是以"$1" “2"…...

2020-03-29 23:09:31 194

原创 Java 类加载器

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:引导类加载器(bootstrap class loader)用来加载 Java 的核心库,是用原生代码 C++ 实现,在 java 里无法获取,并不继承自 java.lang.ClassLoader。主要负责 jdk_home/lib 目录下的核心 api...

2020-03-27 15:37:46 115

原创 二分法对非负数开根

public class MySqrt { public static double sqrt(double n) { if (n == 0) { return 0; } double max; if (n >= 1) { max = n; } else {...

2020-03-26 22:59:49 150

转载 Java JVM OOM

转载于:https://www.jianshu.com/p/8be0daac8dc21. Java 堆空间发生可能性:高造成原因无法在 Java 堆中分配对象吞吐量增加应用程序无意中保存了对象引用,对象无法被 GC 回收应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用,有时 finalizer 线...

2020-03-26 21:02:57 144

原创 MySQL 索引

MySQL 索引使用的数据结构主要有 BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。MySQL 的 BTree 索引使用的是 B 树中的 B+Tree。InnoDB 索引模型在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称...

2020-03-26 20:50:34 117

转载 Java 引用

强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o = new Object(); // 强引用当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下:o...

2020-03-26 11:13:24 107

原创 Java 并发 J.U.C locks 包

java.util.concurrent.locks 包结构如下:Lock在Lock接口出现之前,java程序主要是靠synchronized关键字实现锁功能的,而java SE5之后,并发包中增加了lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性,可中断的获取锁以及超时获取锁等多...

2020-03-25 19:20:09 166

原创 Java 并发 synchronized 的缺陷

synchronized 是 java 中的一个关键字,是 Java 语言内置的特性。如果一个代码块被 synchronized 修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:获取锁的线程执行完了该代码块,然后线程释放对锁的占有;线程执行发生异常,此时 JVM 会让线程自动释放锁。那么...

2020-03-25 19:10:50 413 1

转载 Java 锁

可重入锁如果锁具备可重入性,则称作为可重入锁。像 synchronized 和 ReentrantLock 都是可重入锁,可重入性实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个 synchronized 方法时,比如说 method1(),而在 method1() 中会调用另外一个 synchronized 方法 method2(),此...

2020-03-25 19:04:16 99

原创 Java TreeSet

TreeSet 是基于 TreeMap 实现的。TreeSet 中含有一个 NavigableMap 类型的成员变量 m,而 m 实际上是 TreeMap 的实例。TreeSet 是 SortedSet 接口的实现类,TreeSet 可以保证元素处于排序状态,它采用红黑树的数据结构来存储集合元素。TreeSet 支持两种排序方法:自然排序和定制排序,默认采用自然排序。自然排序TreeSet 会...

2020-03-23 12:11:56 194

原创 Java HashMap 和 Hashtable 区别

继承不同。public class Hashtable extends Dictionary implements Mappublic class HashMap extends AbstractMap implements MapHashtable 中的方法是同步的,而 HashMap 中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用 Hashtable,但是要使...

2020-03-23 11:31:40 1055 1

原创 MySQL 日志

更新涉及两个重要的日志模块:**redo log(重做日志)**和 binlog(归档日志)。MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候...

2020-03-22 23:08:51 147

原创 MySQL 基本架构

下图是 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。MySQL 可以分为 Server 层和存储引擎层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图...

2020-03-21 11:50:51 1649

原创 Linux 守护进程

守护进程是一种运行在后台的特殊进程,它独立于控制终端 ,并周期性地执行某项任务或等待处理某些发生的事件。守护进程可以由一个普通的进程按照守护进程的特性改造而来。守护进程创建步骤让程序在后台执行。方法是调用 fork() 产生一个子进程,然后使父进程退出。子进程中进行形式上脱离了控制终端。子进程调用 setsid() 创建一个新会话。控制终端、登录会话和进程组通常是从父进程继承下来的,守护...

2020-03-13 11:39:33 262

原创 Linux 僵尸进程与孤儿进程

在 unix / linux 中,正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用 wait() 或者 waitpid() 系统调用取得子进程的终止状态。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(...

2020-03-13 11:38:53 193

转载 Java 字符操作

编码与解码编码就是把字符转换为字节,而解码是把字节重新组合成字符。如果编码和解码过程使用不同的编码方式那么就出现了乱码。GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;UTF-16be 编码中,中文字符和英文字符都占 2 个字节。UTF-16be 中的 be 指的是 Big Endian,也就是大端...

2020-03-11 19:14:14 256

原创 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 457

原创 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 133

转载 计算机网络 Cookie

HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)...

2020-03-10 11:07:29 306

转载 Java 先行发生原则

可以用 volatile 和 synchronized 来保证有序性。除此之外,JVM 还规定了先行发生原则,让一个操作无需控制就能先于另一个操作完成。1. 单一线程原则Single Thread rule在一个线程内,在程序前面的操作先行发生于后面的操作。2. 管程锁定规则Monitor Lock Rule一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。...

2020-03-09 19:39:55 477

原创 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 272 2

转载 Java 内存模型

Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。主内存与工作内存处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。所有的变量都存储在...

2020-03-07 21:17:15 166

原创 Java 基本数据类型

数据类型占用空间byte1字节short2字节char2字节(C语言中是1字节)可以存储一个汉字int4字节long8字节float4字节double8字节booleanfalse / true (理论上占用 1bit , 1/8 字节,实际处理按 1字节 处理)long → float 无须强制转换。...

2020-03-07 19:59:38 140

原创 Java 并发:J.U.C 组件

FutureTaskCallable 的 call() 方法有返回值,返回值通过 Future 进行封装。FutureTask 实现了 RunnableFuture 接口,该接口继承自 Runnable 和 Future 接口,这使得 FutureTask 既可以当做一个任务执行,也可以有返回值。public class FutureTask<V> implements Runna...

2020-03-07 17:24:03 207

原创 线程:状态

一个线程只能处于一种状态,并且这里的线程状态特指 Java 虚拟机的线程状态,不能反映线程在特定操作系统下的状态。新建(NEW)创建后尚未启动。可运行(RUNABLE)正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层操作系统的资源调度。阻塞(BL...

2020-03-07 15:23:06 145

原创 线程:协作

当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调。join()在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 join() 方法,b 线程会等待 a 线程结束才继续执行,因此最后能够保证 a 线程的输出先于 b 线程...

2020-03-07 14:55:22 134

原创 线程:互斥同步

Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock(可重入锁)。synchronized1. 同步一个代码块public void func() { synchronized (this) { // ... }}它只作用于同一个对象,如果...

2020-03-07 14:17:48 251

转载 线程:中断

一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。InterruptedException通过调用一个线程的 interrupt() 来中断该线程,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程。但是不能中断 I/O 阻塞和 synchronized 锁阻塞。对于以下代码,在 main() 中启动...

2020-03-07 14:13:55 148

原创 线程:基础机制

ExecutorExecutor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。主要有三种 Executor:CachedThreadPool:一个任务创建一个线程;FixedThreadPool:所有任务只能使用固定大小的线程;SingleThreadExecutor:相当于大小为 1 的 FixedThrea...

2020-03-07 14:13:02 134

原创 线程:基础知识

使用线程有三种使用线程的方法:实现 Runnable 接口;实现 Callable 接口;继承 Thread 类。实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以理解为任务是通过线程驱动从而执行的。实现 Runnable 接口需要实现接口中的 run() 方法。publ...

2020-03-06 23:03:39 169

转载 系统设计 缓存

缓存特征命中率当某个请求能够通过访问缓存而得到响应时,称为缓存命中。缓存命中率越高,缓存的利用率也就越高。最大空间缓存通常位于内存中,内存的空间通常比磁盘空间小的多,因此缓存的最大空间不可能非常大。当缓存存放的数据量超过最大空间时,就需要淘汰部分数据来存放新到达的数据。淘汰策略FIFO(First In First Out):先进先出策略,在实时性的场景下,需要经常访问最新的数据...

2020-03-06 16:26:01 208

转载 系统设计 消息队列

消息模型点对点消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。发布 / 订阅 (现代观察者,非传统观察者模式)消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。发布与订阅模式和观察者模式有以下不同:观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,生产者与消费者不知道对方的存在,它们之间通过频道进行通信。观察者模式...

2020-03-05 12:25:04 455

转载 Java HashMap

HashMap 存储的是 key-value 的键值对,允许 key 为 null,也允许 value 为 null。HashMap 内部为数组 + 链表的结构,会根据 key 的 hashCode 值来确定数组的索引(确认放在哪个桶里),如果发生hash冲突,HashMap 会将同一个桶中的数据以链表的形式存储,但是如果发生hash冲突的概率比较高,就会导致同一个桶中的链表长度过长,遍历效率降...

2020-03-03 20:41:36 160

转载 Java fail-fast

fail-fast 机制,即快速失败机制,是 java 集合( Collection )中的一种错误检测机制。当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生 fail-fast,即抛出 ConcurrentModificationException 异常。fail-fast 机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅用于检测 bug。...

2020-03-03 18:21:28 126

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除