- 博客(45)
- 资源 (14)
- 收藏
- 关注
原创 JAVA并发编程:线程池ThreadPoolExecutor源码分析
前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程。在看源码的时候,首先带着以下两个问题去仔细阅读。一是线程池如何保证核心线程数不会被销毁,空闲线程数会被销毁的呢?二是核心线程和空闲线程的区别到底是什么? 首先,我们先来看一下以下两个示例,从代码示例走入底层源码,真正做到了如指掌。1、示例分析package cn.lspj.threadpool;import java.text.SimpleDateFormat;import java.ut
2020-11-09 23:55:47
298
原创 JAVA并发编程:详解Executors工厂创建线程池的5种方法
上一篇我们详细讲解了线程池的工作原理及其基本的应用,本文主要讲解一下使用Executors工厂创建线程池的5中方法,在JDK1.7中只提供了4中方法(前面4种),而在JDK1.8中新增了一种方法,详细请见下文第五种方式。1、创建固定线程数线程池 创建固定线程数的线程池一共有两个方法,分别如下所示:public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nT
2020-11-04 00:03:39
430
原创 JAVA并发编程:详解线程池的工作原理及应用
1、为什么要使用线程池? Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来以下几个好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成 的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立 即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会 消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和 监控。2、线程池核心类的类关系 Exec
2020-10-30 00:02:59
229
原创 JAVA并发编程:读写锁ReentrantReadWriteLock的基本使用及JDK源码中金典案例分析
1、读写锁简介 之前提到锁(如 Mutex 和ReentrantLock)基本都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。   读写锁维护了一对锁,一个读锁和一个写锁,读写锁在 ReentrantLock 上进行了拓展,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。   除了保证写操作对读操作的可见性以及并发性
2020-09-22 11:20:06
222
原创 JAVA并发编程:深入解析死锁、如何使用JVM自带分析工具检测死锁
1、什么是死锁?死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。2、产生死锁的必要条件互斥条件:所谓互斥就是进程在某一时间内独占资源。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
2020-09-15 20:47:55
321
原创 JAVA并发编程:深入解析JDK1.8中HashMap、并发容器ConcurrentHashMap原理及其源码分析
一、HashMap详解1、基本介绍1.1 概述
2020-08-12 16:26:41
1037
原创 JAVA并发编程:深入解析JDK1.7中HashMap、并发容器ConcurrentHashMap原理及其源码分析
1、HashMap1.1// 构造一个具有指定初始值容量和负载因子的空HashMappublic HashMap(int initialCapacity, float loadFactor) { // 判断传入的初始容量是否大于0,如果小于0,则抛出相应异常信息。 if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " +
2020-07-09 18:40:44
313
原创 JAVA并发编程:详解AQS、显示锁Lock、ReentrantLock及源码分析
1、显示锁 有了 synchronized 为什么还要 Lock? Java 程序是靠 synchronized 关键字实现锁功能的,使用 synchronized 关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。显示锁的特性:尝试非阻塞地获取锁:当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。能被中断地获取锁:与synchronized关键字不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。
2020-06-16 23:36:33
242
原创 JAVA并发编程:详解原子操作、如何使用CAS实现原子操作、JDK中相关原子操作类的基本使用
1、什么是原子操作? 假定有两个操作A 和B,如果从执行A 的线程来看,当另一个线程执行B 时,要么将B 全部执行完,要么完全不执行B,那么A 和B 对彼此来说是原子的。2、如何实现原子操作? 实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制,synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,访问同一资源的其它线程需要等待,直到该线程释放锁。 这里会有些问题:首先,如果被阻塞的线程
2020-05-29 19:11:44
310
原创 JAVA并发编程:线程并发工具类Callable、Future 和FutureTask的使用
1、基本介绍 Runnable 是一个接口,在它里面只声明了一个 run()方法,由于 run()方法返回值为 void 类型,所以在执行完任务之后无法返回任何结果。 Callable 位于 java.util.concurrent 包下,它也是一个接口,在它里面也只声明 了一个方法,只不过这个方法叫做 call(),这是一个泛型接口,call()函数返回的类型就是传递进来的 V 类型。 Future 就是对于具体的 Runnable 或者 Callable 任务的执行结果进行取消、查询是否完成
2020-05-21 11:38:22
407
原创 JAVA并发编程:线程并发工具类CountDownLatch与CyclicBarrier的作用、应用场景和实战
一、CountDownLatch1、基本概念及作用JDK解释:A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 闭锁,CountDownLatch 这个类能够使一个线程等待一个或多个线程成各自的工作后再执行。 CountDownLatch 是通过一个计数器来实现的,计数器的初始值为
2020-05-19 18:39:19
374
原创 JAVA并发编程:线程并发工具类Fork-Join原理分析及实战
1、Fork-JoinJava下多线程的开发我们可以自己启用多线程、线程池,还可以使用ForkJoin。 ForkJoin 可以让我们不去了解诸如 Thread、Runnable 等相关的知识,只要遵循 ForkJoin 的开发模式,就可以写出很好的多线程并发程序。2、Fork-Join体现了分而治之什么是分而治之?一种设计思想、策略。十大计算机经典算法:快速排序、堆排序、归并排序、二分查找、线性查找、深度优先、广度优先、Dijktra、动态规划、朴素贝叶斯分类。其中有三个就属于分而治之的设计思想,分
2020-05-16 20:26:59
168
原创 算法:JAVA实现归并排序
1、核心思想归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为 2-路归并,与之对应的还有多路归并。对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序后,再用递归方法将排好序的半子表合并成为越来越大的有序序列。 为了提升性能,有时我们在半子表的个数小于某个数(比如 15)的情况下,对半子表的排序采用其
2020-05-12 23:11:52
334
原创 算法:JAVA实现插入排序
1、核心思想插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。简单来说就是将一个记录插入到已排好序的序列中,从而得到一个新的有序序列(将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序)。2、代码示例输入:int[] array
2020-05-11 18:45:11
225
原创 并发编程:线程中Join方法的使用示例分析
Join方法的使用,简单来说就是把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行。 比如在线程 B 中调用了线程 A 的 Join()方法,直到线程 A 执行完毕后,才会继续执行线程 B。代码示例如下所示:package cn.lspj.ch1.base;public class UseJoin { static class A implements Ru...
2020-05-05 02:07:27
478
原创 并发编程:线程基础、JAVA新启线程的方式
一、简单描述什么是进程和线程1、进程:进程是程序运行资源分配的最小单位。2、线程:线程是CPU调度的最小单位,必须依赖于进程而存在。二、创建线程的几种方式在JDK的源码Thread类中明确表示,创建线程的方式一共有两种:一种是继承Thread类 另外一种是实现Runnable接口。如下图Thread类中的描述所示:具体示例请看如下代码:package cn....
2020-05-02 17:12:11
145
原创 MYSQL之limit基本用法
在日常开发过程中,我们经常会使用select查询数据返回前n行或者中间某n行数据,此时mysql中的limit字句就改派上用场了。在select语句中使用limit子句来约束结果集中的行数,limit子句接受一个或两个参数。语法如下:SELECT * FROM table LIMIT offset,rowsoffset:参数指定要返回的第一行的偏移量。第一行的偏移量为0,而不是1。...
2019-09-28 23:42:06
922
原创 浅谈Spring核心技术 IOC与AOP
IOC:IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理。IOC容器是Spring用来实现IOC的载体,IOC容器实际上就是一个Map(key, value),Map中存放的是各种对象。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂,当需要创建一个对象...
2019-09-22 12:34:26
207
原创 mvn clean package Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
maven 工程执行 mvn clean package 命令出错:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project eureka-server: There are test failures.[ERROR]...
2019-08-19 18:50:17
427
原创 图文详解IDEA如何创建Eureka Server 注册中心和 Eureka Client
一、创建Eureka Server,配置用户安全认证1、File-New_Project2、New Project ,左侧选择Spring Initializr,JDK版本选择1.8以上,Choose Initializr Service URL 选择 Default即可,点击下一步。3、填写Group、Artifact、Name及其Package,点击下一步。4...
2019-08-02 18:53:56
792
原创 Eureka client 启动报错 Completed shut down of DiscoveryClient
由于在创建项目时未选择依赖,启动时控制台报 Unregistering application XXX-CLIENT with eureka with status DOWN,Completed shut down of DiscoveryClient 错误,需要在对应项目的pom.xml文件中加入依赖即可解决。如下所示:<dependency> <groupId&...
2019-06-10 19:06:20
692
1
原创 详解Java 8 中使用Stream将List转为Map
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。下面将详细讲解在Java 8 中如何使用Stream将List转换为Map,使用Collectors.toMap方法进行转换。背景:User类,类中分别有id,name,age三个属性。List集合,use...
2019-06-06 10:12:27
36082
1
原创 Spring中@Controller、@Repository、@Service、@Component注解的作用详解
Spring中使用在类上的常用注解有@Controller、@Repository、@Service、@Component,下面分别详细介绍一下他们的作用:1、@Controller:用于标注控制层服务。2、@Repository:用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件。3、@Service:用于标注业务逻辑层服务,主要用来进行业务的逻辑处理,注入DAO。这种b...
2019-05-06 15:27:59
4566
原创 给定二叉树,找到它的最小深度。
给定二叉树,找到它的最小深度。最小深度是沿从根节点到最近的叶节点的最短路径上的节点数。注意:叶子是没有子节点的节点。package com.example.tree;/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...
2019-01-31 15:10:26
630
原创 给定一个二叉树,检查它是否是自身的镜像(即,围绕其中心对称)
给定一个二叉树,检查它是否是自身的镜像(即,围绕其中心对称)。例如,这个二叉树[1,2,2,3,4,3,3]是对称的:但是以下[ 1,2,2,null,3,null,3]不是:package com.example.tree;public class TreeNode { int val; TreeNode left; TreeNode right; Tree...
2019-01-31 14:57:13
630
原创 给定一棵二叉树,找出它的最大深度
给定一棵二叉树,找出它的最大深度。 最大深度是从根节点到最远叶节点的最长路径上的节点数。 Example: 二叉树: [3,9,20,null,null,15,7], return its depth = 3.Java代码实现如下:package leetcode;/** * 计算二叉树的最大深度 */public class MaximumDepthBinaryTr...
2018-08-25 22:23:17
4427
1
原创 给定两棵二叉树,写一个函数来检查它们是否相同。
给定两棵二叉树,写一个函数来检查它们是否相同。 如果两个二叉树在结构上相同且节点具有相同的值,则它们被认为是相同的。 Java代码如下: * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right...
2018-08-18 15:52:21
1365
2
原创 给定字符串J中的字母保证不同,J和S中的所有字符都是字母。字母是区分大小写的,所以“a”被认为是“A”的不同类型的字符。计算J中的字符在S中出现的次数。
You’re given strings J representing the types of stones that are jewels, and S representing the stones you have. Each character in S is a type of stone you have. You want to know how many of the sto...
2018-08-09 09:26:02
309
原创 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。
给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].Java代码如下:package le...
2018-08-04 10:34:55
2658
2
原创 给定排序数组和目标值,如果找到目标,则返回索引。 如果没有,请返回索引按顺序插入的索引。
给定排序数组和目标值,如果找到目标,则返回索引。 如果没有,请返回索引按顺序插入的索引。您可以假设数组中没有重复项。Example 1:Input: [1,3,5,6], 5Output: 2Example 2:Input: [1,3,5,6], 2Output: 1Example 3:Input: [1,3,5,6], 7Output: 4Example 4:Input: [1,3,5,6...
2018-08-04 10:23:47
1036
原创 输入一个整数,实现反转输出,如输入123,输出321。
输入一个整数,实现反转输出. Example 1: Input: 123 Output: 321Example 2: Input: -123 Output: -321Example 3: Input: 120 Output: 21Java代码实现如下:package leetcode;/** * 输入一个整数,反转输出 */public class Re...
2018-08-04 09:43:42
20384
2
原创 设计模式——工厂方法
定义工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品 工厂方法设计模式的UML类图如下: 模式简介工厂方法(Factory Method)模式的意义是定义一个创建...
2018-06-23 17:53:51
290
原创 设计模式——简单工厂
定义简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。1、实现方式简单工厂模式的UML类图 简单工厂模式的实质是由一个工厂类动态决定应该创建哪一个产品...
2018-06-16 18:49:10
191
1
转载 Java7/8 中的 HashMap 和 ConcurrentHashMap 全面解析
原文地址:https://javadoop.com/post/hashmap 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍。本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的。网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透...
2018-06-02 00:02:52
880
1
原创 java实现多个数组中时间段重复去重,最后获取一天的有效时间段
public class TestL { public static void main(String[] args) { List&amp;lt;String[]&amp;gt; listIn = new ArrayList&amp;lt;String[]&amp;gt;(); String[] a = {&quot;07:00&quot;,&quot
2018-06-01 14:30:08
2710
1
转载 【分布式】Zookeeper的Leader选举-详细介绍
http://www.cnblogs.com/leesf456/p/6107600.html一、前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举。二、Leader选举 2.1 Leader选举概述 Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种...
2018-05-30 15:26:22
222
1
原创 懒汉式实现单例模式
package pattern;/** * 懒汉式实现单例模式 * 1、创建一个静态变量 * 2、构造方法私有化 * 3、创建一个静态方法获取实例对象,如果对象为空则创建对象 * @author Administrator * */public class Singleton { private static volatile Singleton...
2017-05-17 23:35:36
400
1
原创 折半查找算法(二分查找算法)
package queue;/** * 折半查找算法(二分查找算法) * @author Administrator * */public class HalfSearch { public static int halfSearch(int[] array,int key){ int left = 0; int right = array.length-1; ...
2017-05-17 23:31:30
378
1
原创 Java实现查找链表的中间节点,(在未知链表长度的情况下)
下面是自己实现的一个类似于LinkedList类,其中getMidNode方法是获取链表的中间节点的实现方法(在未知列表长度的情况下),大致思路如下:1、首先在方法中定义temp 、temp2两个局部变量。2、temp每次循环next一次,temp2每次循环next两次,当temp2.next==null时表示temp2已经执行到达了链表的末尾,而temp刚好执行到链表的一半。备注:...
2017-05-17 22:50:55
1261
设计一个Time类
2012-06-18
设计一个Triangle类
2012-06-18
设计一个Person类,有Person类派生一个Student类和一个Teacher类
2012-06-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人