摘要: 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap。 HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当阅读全文
posted @ 2018-08-15 15:43 狂小白 阅读(239) 评论(0) 编辑
摘要: 一、HashMap概述 HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap与HashTable的作用大致相同,但是它不是线程安全的。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 遍历HashMap的时间复杂度与其的容量(阅读全文
posted @ 2018-08-13 21:44 狂小白 阅读(319) 评论(0) 编辑
摘要: 一.JVM 类加载器: 一个类在使用前,如何通过类调用静态字段,静态方法,或者new一个实例对象,第一步就是需要类加载,然后是连接和初始化,最后才能使用。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Prepa阅读全文
posted @ 2018-08-06 18:36 狂小白 阅读(159) 评论(0) 编辑
摘要: 一.垃圾回收器配置和 GC 日志分析 1.堆典型配置: 32位的操作系统限制堆大小介于1.5G到2G,64位操作系统无限制,同时系统可用虚拟内存和可用物理内存都会限制最大堆的配置。 堆空间分配典型配置: 1.-Xms:初始堆大小 2.-Xmx:最大堆大小 3.-XX:NewSize=n:设置年轻代大阅读全文
posted @ 2018-08-05 15:26 狂小白 阅读(214) 评论(0) 编辑
摘要: 使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: 代码(1)创建了一个核心线程数和最大线程数为 6 的线程池,这个保证了线程池里面随时都有 6 个线程在运行。 代码(2)创建了一个 ThreadLocal 的变量,泛型参数为 Loca阅读全文
posted @ 2018-07-14 23:21 狂小白 阅读(385) 评论(1) 编辑
摘要: FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线阅读全文
posted @ 2018-07-13 17:32 狂小白 阅读(188) 评论(0) 编辑
摘要: SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个 SimpleDateFormat 实例对日期进行解析或者格式化会导致程序出错,本节就讨论下它为何是线程不安全的,以及如何避免。 为了复现上面所说的不阅读全文
posted @ 2018-07-12 16:14 狂小白 阅读(232) 评论(4) 编辑
摘要: timer在JDK里面,是很早的一个API了。具有延时的,并具有周期性的任务,在newScheduledThreadPool出来之前我们一般会用Timer和TimerTask来做,但是Timer存在一些缺陷,为什么这么说呢? Timer只创建唯一的线程来执行所有Timer任务。如果一个timer任务阅读全文
posted @ 2018-07-12 01:47 狂小白 阅读(291) 评论(0) 编辑
摘要: JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那么,Semaphore 的内部实现是怎样的呢? Semaphore 信号量也是Java 中一个同步容阅读全文
posted @ 2018-07-08 17:23 狂小白 阅读(132) 评论(0) 编辑
摘要: JUC 中 回环屏障 CyclicBarrier 的使用与分析,它也可以实现像 CountDownLatch 一样让一组线程全部到达一个状态后再全部同时执行,但是 CyclicBarrier 可以被复用。那么 CyclicBarrier 内部的实现与 CountDownLatch 有何不同那? Co阅读全文
posted @ 2018-07-07 22:10 狂小白 阅读(106) 评论(0) 编辑
摘要: JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountDownLatch 与 线程的 join 方法区别是什么? 日常开发中经常会遇到需要在主线程中开启多线阅读全文
posted @ 2018-07-06 21:33 狂小白 阅读(173) 评论(0) 编辑
摘要: JDK 中无界优先级队列PriorityBlockingQueue 内部使用堆算法保证每次出队都是优先级最高的元素,元素入队时候是如何建堆的,元素出队后如何调整堆的平衡的? PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最好或者最低的元素,内部是平衡二叉树堆阅读全文
posted @ 2018-06-26 16:34 狂小白 阅读(159) 评论(0) 编辑
摘要: JDK 中基于数组的阻塞队列 ArrayBlockingQueue 原理剖析,ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全? 首先我们先大概的浏览一下ArrayBlockingQueue 的内部构造,如下类图: 如类图所示,可以看到Arr阅读全文
posted @ 2018-06-24 16:58 狂小白 阅读(128) 评论(0) 编辑
摘要: JDK 中基于链表的阻塞队列 LinkedBlockingQueue 原理剖析,LinkedBlockingQueue 内部是如何使用两个独占锁 ReentrantLock 以及对应的条件变量保证多线程先入队出队操作的线程安全?为什么不使用一把锁,使用两把为何能提高并发度? LinkedBlocki阅读全文
posted @ 2018-06-23 21:45 狂小白 阅读(205) 评论(0) 编辑
摘要: JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析,ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全? ConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构是使用单阅读全文
posted @ 2018-06-19 16:46 狂小白 阅读(220) 评论(0) 编辑
摘要: StampedLock是JUC并发包里面JDK1.8版本新增的一个锁,该锁提供了三种模式的读写控制,当调用获取锁的系列函数的时候,会返回一个long 型的变量,该变量被称为戳记(stamp),这个戳记代表了锁的状态。 try系列获取锁的函数,当获取锁失败后会返回为0的stamp值。当调用释放锁和转换阅读全文
posted @ 2018-06-16 23:27 狂小白 阅读(227) 评论(0) 编辑
摘要: 我们知道在解决线程安全问题上使用 ReentrantLock 就可以,但是 ReentrantLock 是独占锁,同时只有一个线程可以获取该锁,而实际情况下会有写少读多的场景,显然 ReentrantLock 满足不了需求,所以 ReentrantReadWriteLock 应运而生,Reentra阅读全文
posted @ 2018-06-14 16:43 狂小白 阅读(228) 评论(1) 编辑
摘要: ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞后放入该锁的AQS阻塞队列里面。 首先我们先看一下ReentrantLock的类图结构,如下图所示: 从类图可以知道,ReentrantLock最终还是使用AQS来实现,并且根据参数决定内部是公平锁阅读全文
posted @ 2018-06-12 16:04 狂小白 阅读(177) 评论(1) 编辑
摘要: 为什么要说AbstractQueuedSynchronizer呢? 因为AbstractQueuedSynchronizer是JUC并发包中锁的底层支持,AbstractQueuedSynchronizer是抽象同步队列,简称AQS,是实现同步器的基础组件,并发包中锁的实现底层就是使用AQS实现,另阅读全文
posted @ 2018-06-10 22:06 狂小白 阅读(121) 评论(0) 编辑
摘要: 并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝数组(快照)上进行的,也就是写时拷贝策略。 我们首先看一下CopyOnWriteArrayList的阅读全文
posted @ 2018-06-09 20:34 狂小白 阅读(194) 评论(0) 编辑
摘要: 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap。 HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当阅读全文
posted @ 2018-08-15 15:43 狂小白 阅读(239) 评论(0) 编辑
摘要: 一、HashMap概述 HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap与HashTable的作用大致相同,但是它不是线程安全的。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 遍历HashMap的时间复杂度与其的容量(阅读全文
posted @ 2018-08-13 21:44 狂小白 阅读(319) 评论(0) 编辑
摘要: 一.JVM 类加载器: 一个类在使用前,如何通过类调用静态字段,静态方法,或者new一个实例对象,第一步就是需要类加载,然后是连接和初始化,最后才能使用。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Prepa阅读全文
posted @ 2018-08-06 18:36 狂小白 阅读(159) 评论(0) 编辑
摘要: 一.垃圾回收器配置和 GC 日志分析 1.堆典型配置: 32位的操作系统限制堆大小介于1.5G到2G,64位操作系统无限制,同时系统可用虚拟内存和可用物理内存都会限制最大堆的配置。 堆空间分配典型配置: 1.-Xms:初始堆大小 2.-Xmx:最大堆大小 3.-XX:NewSize=n:设置年轻代大阅读全文
posted @ 2018-08-05 15:26 狂小白 阅读(214) 评论(0) 编辑
摘要: 一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理。 1.void interrupt() 方法:中断线程,例如当线程 A 运行时,线程 B 可以调用线程 A 的 interrupt() 方法来设置线程 阅读全文
posted @ 2018-07-17 23:25 狂小白 阅读(255) 评论(0) 编辑
摘要: 一.线程概念 说到线程就必须要提一下进程,因为线程是进程中的一个实体,线程本身是不会独立存在的。进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程中的多个线程是共享进程的资源的。操作系统在分配资源时候是把资源分配给进程的阅读全文
posted @ 2018-07-17 15:44 狂小白 阅读(241) 评论(0) 编辑
摘要: 使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: 代码(1)创建了一个核心线程数和最大线程数为 6 的线程池,这个保证了线程池里面随时都有 6 个线程在运行。 代码(2)创建了一个 ThreadLocal 的变量,泛型参数为 Loca阅读全文
posted @ 2018-07-14 23:21 狂小白 阅读(385) 评论(1) 编辑
摘要: FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线阅读全文
posted @ 2018-07-13 17:32 狂小白 阅读(188) 评论(0) 编辑
摘要: SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个 SimpleDateFormat 实例对日期进行解析或者格式化会导致程序出错,本节就讨论下它为何是线程不安全的,以及如何避免。 为了复现上面所说的不阅读全文
posted @ 2018-07-12 16:14 狂小白 阅读(232) 评论(4) 编辑
摘要: timer在JDK里面,是很早的一个API了。具有延时的,并具有周期性的任务,在newScheduledThreadPool出来之前我们一般会用Timer和TimerTask来做,但是Timer存在一些缺陷,为什么这么说呢? Timer只创建唯一的线程来执行所有Timer任务。如果一个timer任务阅读全文
posted @ 2018-07-12 01:47 狂小白 阅读(291) 评论(0) 编辑