![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程和网络编程
文章平均质量分 83
JayLaiSCUT
从事大数据平台和后端开发工作,热爱IT新技术,热爱开源
展开
-
Java源码解读系列13—HashMap(JDK1.8 )
1 概述JDK7的HashMap底层采用数组+链表数据结构进行存储,会存在一个问题,即当解决哈希碰撞的链表过长的时候,HashMap的查询效率就会变低。红黑树是平衡二叉树(黑色平衡),其查询效率为O(lgn),优于链表的查询效率O(n)。 因此JDK8的HashMap底层采用数组+链表+红黑树数据结构进行存储。具体过程如下, 1)每次新增一个数据,就会被插入到数组中的空位。慢慢的数据多了,就会存在哈希碰撞问题,即2个key的索引一样。HashMap采用的解决方法是链地址法。数组中每个元素设置链表。ke原创 2021-04-19 01:03:18 · 3947 阅读 · 0 评论 -
Java源码解读系列11—线程池(上,JDK1.8 )
1 概述一开始听到这么牛逼的名字,博主还以为是操作系统的底层直接提供的,可以用来直接创建线程的。看完源码后才知道,线程池实际上是java.util.concurrent包下面用来管理线程的工具,开发语言是java代码,启动线程还是依赖于底层提供的Thread类的Native方法start0()。线程池的优点主要有 1)复用线程对象,降低频繁的创建和销毁线程是带来的开销。2)方便管理线程。线程池已经封装了线程监管,异常处理,线程创建和销毁等方法,开箱即用。 3)提供并发处理性能。因为线程池中核心原创 2021-04-13 23:19:42 · 3852 阅读 · 1 评论 -
Java源码解读系列12—线程池(中,JDK1.8 )
1 概述通过上一篇《Java源码解读系列11—线程池(JDK1.8 )》的学习,对于先线程池的使用应该问题不大。线程池源码非常多,本文主要讲解如何通过线程池复用线程,使用线程池创建的线程跟我们Thread类的start方法究竟有何异同。2 线程池状态将线程池状态存储在二进制的高位置。private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));//32 - 3 = 29private static final int原创 2021-04-14 00:53:23 · 3753 阅读 · 0 评论 -
Java源码解读系列10—SynchronousQueue(非公平模式,JDK1.8 )
1 概述SynchronousQueue(简称SQ)是BlockingQueue接口的实现类,是一种阻塞、线程安全的、不存储任何元素的同步队列。SQ的底层实现分为两种,一种是非公平模式(默认),采用栈的数据结构,先入队的数据,后出队,即可LIFO;另外一种是公平模式,采用队列的数据结构,先入队的数据,先出队,即FIFO。SQ跟LinkedBlockingQueue(LBQ)和ArrayBlockingQueue(ABQ)等阻塞队列,最大一个不同点是一个线程t1执行put操作后,必须有另外线程t2原创 2021-04-04 22:28:47 · 4090 阅读 · 0 评论 -
Java源码解读系列9—SynchronousQueue(公平模式,JDK1.8 )
1 概述SynchronousQueue(简称SQ)是BlockingQueue接口的实现类,是一种阻塞、线程安全的、不存储任何元素的同步队列。SQ的底层实现分为两种,一种是非公平模式(默认),采用栈的数据结构,先入队的数据,后出队,即可LIFO;另外一种是公平模式,采用队列的数据结构,先入队的数据,先出队,即FIFO。SQ跟LinkedBlockingQueue(LBQ)和ArrayBlockingQueue(ABQ)等阻塞队列,最大一个不同点是一个线程t1执行put操作后,必须有另外线程t2原创 2021-04-04 11:50:25 · 4268 阅读 · 3 评论 -
Java源码解读系列8—ArrayBlockingQueue(JDK1.8 )
1 概述ArrayBlockingQueue(简称ABQ)是BlockingQueue接口的实现类,是一种有界界、阻塞、线程安全的FIFO队列。ABQ底层存储基于数组,因此需要在初始化时候指定数组容量。相对基于链表实现的阻塞队列LinkedBlockingQueue(简称LBQ),ABQ队列中元素的入队和出队都是使用同一把锁来保证线程安全,实现更加简单。2 构造函数//capacity是数组容量public ArrayBlockingQueue(int capacity) { //默认原创 2021-03-28 22:24:39 · 4456 阅读 · 0 评论 -
Java源码解读系列6—LinkedBlockingQueue(JDK1.8 )
1 概述LinkedBlockingqueue(简称LBQ)是BlockingQueue接口的实现类,是一种无界、阻塞、线程安全的FIFO队列。LBQ底层存储基于链表,头节点为哨兵节点,里面的数据域(item)为空。插数据时从尾节点插入,取数据时从头节点(若队列非空,则找第一个item不为空的节点)获取。相对于非阻塞的ConcurrentLinkedQueue(简称CLQ队列),LBQ的实现比较简单,就是采用添加和取出两把锁来保证线程安全。2 链表节点的数据结构 static class Node原创 2021-03-21 16:38:24 · 4609 阅读 · 0 评论 -
Java源码解读系列7—ConcurrentLinkedQueue(JDK1.8 )
1 概述ConcurrentLinkedQueue(简称CLQ队列)是Queue接口的实现类,是一种无界、非阻塞、线程安全的FIFO队列。CLQ底层存储基于链表,头节点为哨兵节点,里面的数据域(item)为空。插数据时从尾节点插入,取数据时从头节点获取。相对于LinkedBlockingqueue(简称LBQ队列)采用读写各一把锁的机制保证线程安全,CLQ队列采用自旋+CAS机制实现无锁非阻塞。无论是同时有又多个生产者,还是多个消费者,都不会发生线程阻塞,遇到插入失败或者取数据失败的线程就会继续自旋,直到原创 2021-03-21 14:17:41 · 4664 阅读 · 0 评论 -
Java源码解读系列5—FutureTask(JDK1.8 )
1 概述FutureTask类是Future接口和Runnable接口的实现类,主要为了解决异步计算并获取返回值,缺点也很明显,获取返回值的方法get是阻塞的,如果获取不到返回值会阻塞当前线程,是典型的阻塞编程。下面是一个使用用例:public class CallableApp implements Callable<String> { private String name; public CallableApp(String name) { th原创 2021-03-13 22:28:50 · 4693 阅读 · 1 评论 -
Java源码解读系列2—Unsafe类(JDK1.7 )
1 概述Java与C语言一个较大差别是JVM屏蔽底层细节,使我们开发能够更专注于业务实现。Unsafe类,顾名思义就说非安全类,属于sun.misc包下,是java开放给用户直接接触底层。网上大部分文章大部分直接讲解API,楼主这篇文章是通过应用场景去讲解Unsafe类,并且每个用途都附上使用用例,不仅懂你原理,还让你会使用。但还是由衷告诫你,除非是用来开发基础框架,否则不推荐使用。2 初始化方法在ConcurrentHashMap的源码中,我们可以看到Unsafe的示例化方法private st原创 2021-03-07 23:21:52 · 4770 阅读 · 1 评论 -
Java源码解读系列4—ReentrantLock(JDK1.8 )
1 概述Java程序提供两种方法来实现锁功能1)synchronized关键字和2)lock接口,两者最大区别是synchronized是Java内置的关键字,是JVM层面的锁;而lock是java.util.concurrent包下面提供的工具,由Java代码编写的。在JDK1.6之前,synchronized是重量级锁,每次都会调用OS使线程进入阻塞状态;ReentrantLock是轻量锁,如果只是当单纯线程交替等场景,是不会触发OS的,性能优于synchronized关键字。现在两者性能已经差不多,原创 2021-03-06 12:33:33 · 4601 阅读 · 3 评论 -
Java源码解读系列3—ConcurrentHashMap(JDK1.7 )
1 概述普通的的curd业务工作,一般都是单线程居多,key-value操作基本是HashMap一招吃遍天下鲜。博主由于工作原因,每天工作需要使用大量多线程技术,因此本文不是定位为解释ConcurrentHashMap中的每一行代码,而是从解决并发的视角去思考,为什么ConcurrentHashMap能用于多线程环境!涉及到并发场景,我们可以使用线程安全容器HashTable和ConcurrentHashMap替代HashMap。HashTable解决多线程访问时对每个方法都加了synchronized原创 2021-02-15 21:36:22 · 4654 阅读 · 1 评论 -
Jmeter入门:RESTful接口压测
1 安装JDKJmeter 是基于Java,因此需要Java环境。网上安装JDK资料很多,在此不再累述。2 安装Jmeter从官网下载windows版安装包apache-jmeter-5.4.zip,解压到本地D:\apache-jmeter-5.42.1 修改环境变量1)新增全局变量JMETER2)修改CLASSPATH在末尾添加:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;3)修改原创 2021-01-26 23:56:43 · 5421 阅读 · 0 评论 -
Java源码解读系列1—HashMap(JDK1.7 )
1 HashMap的默认构造方法HashMap底层采用数组+链表数据结构进行存储。每次新增一个数据,就会被插入到数组中的空位。慢慢的数据多了,就会存在哈希碰撞问题,即2个key的索引一样。HashMap采用的解决方法是链地址法。数组中每个元素设置链表。key映射到数组某个元素中,而数据项本身插入到元素的链表中。//数组的默认容量为16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认负载因子为0.75,建议不要设置超过原创 2020-08-24 16:45:32 · 522 阅读 · 1 评论 -
基于Guava库的ListenableFuture类实现Java异步编程
指出了Future类的缺点,并详细介绍ListenableFuture的使用原理和方法,并举例说明原创 2017-12-28 10:17:36 · 2835 阅读 · 0 评论 -
Java并发编程之Callable类和Future接口
本文介绍了利用Callable接口 + Future创建线程的优点,并举例说明原创 2017-12-27 22:26:19 · 2563 阅读 · 0 评论 -
SimpleDateFormat非线程不安全
介绍了SimpleDateFormate在多线程条件下非安全特性,并利用JDK8时间新特性和ThreadLocal进行线程安全处理原创 2017-12-24 19:46:15 · 2491 阅读 · 0 评论 -
volatile关键字
volatile关键字是JVM提供的轻量级同步机制。本文从1.volatile关键字的作用 ,2.volatile的非原子性, 3.关键字volatile和synchronized的区别 4.发展趋势 4个方面,系统性地介绍了volatile关键字。原创 2017-06-06 15:54:31 · 2952 阅读 · 0 评论 -
BIO,NIO和AIO三者的原理及区别
本文简明扼要地介绍了BIO,NIO和AIO三种不同I/O的原理及优缺点,并举例说明三者如何使用。原创 2017-08-13 23:06:47 · 2840 阅读 · 0 评论