
JAVA笔记
文章平均质量分 92
Orange_橙子先生
一步一个脚印,坚持学习,成为一名优秀的程序员!
展开
-
Java并发编程之ThreadPoolExecutor源码解析
前言:在我们日常的并发编程中,如果每一个请求都对应一个线程,这样不仅线程的创建和销毁都将很占用资源,也会给系统带来巨大的压力,很容易造成系统崩溃。鉴于此,线程池的出现就很好的化解了这一问题。线程的池化就是指创建指定个数的线程放到容器中,有任务的时候线程会去执行,任务处理完就会放回线程池等待其他执行其他任务。如此就可以做到线程的重复使用。一:ThreadPoolExecutor中重要的成员变量private final AtomicInteger ctl = new AtomicInteger(ctlOf原创 2020-05-10 13:10:38 · 381 阅读 · 0 评论 -
Java并发编程之CyclicBarrier
CyclicBarrierCyclicBarrier明面上翻译是循环栅栏的意思。差不多是到了指定的人数把栅栏推到,放人出去,出去后栅栏又被扶起来,再来人,满了,推倒之后又被扶起,如此往复。下面通过两个场景来分析 CyclicBarrier 的具体用法:场景一:现在需要访问数据库、需要访问网络、需要访问文件系统等,必须这些都完成后才可以进行下面的操作。如果串行化处理效率不高,可以先并行处理后...原创 2020-04-26 17:05:55 · 206 阅读 · 0 评论 -
Java并发编程之CountDownLatch
CountDownLatchCountDown 的意思是倒数,latch是门栓的意思,连起来就可以翻译为倒数的门栓。在我们Java体现的意思就是:在多线程的环境下,你可以规定有10个门栓(即10个线程在干活),当门栓数减到零(即每个线程完成自己的任务后会把门栓数减一,10个线程都完成后门栓数就减到了零),就可以统一执行接下来的任务。接下来我们通过三个场景来了解 CountDownLatch 的...原创 2020-04-22 10:49:03 · 343 阅读 · 0 评论 -
Java并发编程之Thread-pre-message设计模式
Thread-Per-Message的意思是为每一个消息的处理开辟一个线程使得消息能够以并发的方式进行处理,从而提高系统整体的吞吐能力。相当于一个请求过来,就会有一个线程为当前请求服务。特点:提升系统的响应,缩短响应时间当请求的资源比较耗时的时候,可以采用这个方法,当响应的时间比新创建一个线程还短的时候就没有必要使用。没有返回值无需等待实行的结果没有顺序可言请求没有先后的...原创 2020-04-18 13:40:08 · 306 阅读 · 0 评论 -
Java并发编程之读写锁设计模式
日常开发中,有这样的场景,某些数据读的次数远超于写的次数,但是在多线程环境下读写并不能同时进行。读是可以并行处理的,但是写却不能。读写读✅❌写❌❌只有读读是可以并行的,别的必须做到读写分离。下面将演示读写锁模式,读的时候放开,但是写的时候需要添加锁机制,保证线程安全。// 读写锁public class ReadWriteLock { ...原创 2020-04-17 16:23:19 · 269 阅读 · 0 评论 -
Java并发编程之单线程执行设计模式
在多线程环境中,如何保证共享资源的合理使用。就可以引出这个设计模式。场景:多个游客要验证身份后才能通过检票口角色作用Gate资源、 并提供方法使用资源User使用资源的地方Client模拟多个线程使用资源代码演示:public class Gate { private String name; private String ad...原创 2020-04-17 15:10:32 · 220 阅读 · 0 评论 -
Java并发编程之单利模式
一:什么是单利模式单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。其目的是保证整个应用中只存在类的唯一个实例。二:单利模式的四种实现方式2.1:饿汉式public class Singleton { private static Singleton instance = new Singleton(); // 私有化构造方法 private Singleton() {...原创 2020-04-17 14:38:09 · 198 阅读 · 0 评论 -
Java并发编程之Balking设计模式
Balking翻译过来有防止、回避的意思,Balking的设计理念是当一个线程去执行某个任务的时候,发现其他线程已经把这个任务做了,于是就不用去干了。基于这样的理念就出现这种多线程的设计模式。相比于 Guarded Suspension 设计模式,Guarded Suspension 是一旦达到某种条件才去执行,而 Balking 是如果一旦某种条件达到,就中断执行。场景:我们在CSDN上编...原创 2020-04-17 14:14:58 · 321 阅读 · 0 评论 -
Java并发编程之Guarded Suspension设计模式
Guarded Suspension 设计模式大体概念就是当服务请求过多时,先排起队,后慢慢进行处理。核心思想在于缓冲服务。当我们服务端处理客户端的请求过多时,超出了我们服务的及时处理能力范围,但是又不能放弃任何一个请求,此时,这种设计模式就应运而生,先让客户端的请求进行排队,后由服务端程序一个一个处理。这样就可以做到两不耽误。代码演示之前先看一下各类所起到的作用:角色作用...原创 2020-04-16 16:27:41 · 246 阅读 · 0 评论 -
Java并发编程之Future设计模式 (未来设计模式)
所谓的未来设计模式就是不需要线程阻塞,提前把结果反馈给你。在我们日常开发中经常有这样的场景:我们需要等待一个线程返回结果后,根据这个结果才能执行下面的逻辑。下面的代码就演示了这个场景:public class SyncInvoker { public static void main(String[] args) { String result = getResult(...原创 2020-04-16 10:47:31 · 512 阅读 · 0 评论 -
Java并发编程之深入解析ThreadLocal
前言:在学习多线程的过程中,ThreadLocal是必备的知识点。在很多情况下,我们只知道ThreadLocal的用法以及它在解决共享参数的频繁传递与线程安全问题方面有不错的表现,但是其底层的实现还是很模糊,那么这篇文章我们就来深入的解析下ThreadLocal。一:ThreadLocal的简单介绍ThreadLocal的从表面来看是本地线程,其实他是Thread的本地变量,是每个线程独享的本...原创 2020-04-11 12:15:14 · 311 阅读 · 0 评论 -
基于jdk1.8的ConcurrentHashMap的源码分析
前言:通过前面几篇文章的分析,我们知道HashMap是线程不安全的,Hashtable是线程安全的,但是很占资源,本文分析的ConcurrentHashMap也是线程安全的,所以我们就有必要去分析ConcurrentHashMap底层实现和保证线程安全性的机制。建议在看此文之前,去看下基于jdk1.8的HashMap的源码分析 本文还是会从成员属性、数据结构、构造方法、常用方法以及常...原创 2020-03-21 22:29:23 · 236 阅读 · 0 评论 -
基于jdk1.8的HashTable的源码分析
前言:HashTable的底层也是基于散列表来实现的,和HashMap有着千丝万缕的联系,作为map家族另外一个常用集合面试中也是经常被问到这两者之间的区别,对其源码的解读肯定对我们有很大的提升。本文将会围绕其数据结构、构造方法、以及里面的常用方法进行展开,来解析HashTable的源码。以最简单的方式,来读懂最难的代码。一:HashTable的具体实现HashTable的数据结构和HashM...原创 2020-03-18 15:46:53 · 328 阅读 · 0 评论 -
基于jdk1.8的HashSet的源码分析
前言:HashSet也是我们开发中常用的数据结构之一,它的特点是:无序(存储和读取的顺序有可能不一样)、不重复(要求元素唯一)、可以有null值(只能有一个)、没有索引等。其实他的底层是基于HashMap来实现的,所以在看这篇文章之前可以去翻看一下我的上一篇博客 基于jdk1.8的HashMap的源码分析。本文还是一样,会从成员属性、构造方法、常用方法来进行分析,以最简单的方式,来读懂最难的代码。...原创 2020-03-18 11:29:25 · 214 阅读 · 0 评论 -
基于jdk1.8的HashMap的源码分析
基于jdk1.8的HashMap的源码分析前言:作为存储数据的容器,HashMap的重要性不言而喻。本文将会围绕其数据结构、构造方法、put、get、resize、transfer等方法进行展开,来解析HashMap的源码。以最简单的方式,来读懂最难的代码。一:HashMap的数据结构1.1:HashMap底层的数据结构在jdk1.7中,HashMap是基于数组和链表来实现的,但是随着数据...原创 2020-03-17 16:31:46 · 213 阅读 · 0 评论 -
基于jdk1.8的LinkedList的源码分析
基于jdk1.8的LinkedList的源码分析前言:上篇文章我们已经分析了ArrayList的源码,了解到ArrayList的底层其实是数组结构,但是今天分析LinkedList的底层结构不太一样,它的底层是基于链表来实现的。本文我们还是会从构造方法、增加元素、删除元素、修改元素、查找元素以及它的遍历来进行解析。一:基本的链表在开始分析LinkedList的源码之前,我们先了解一下基本的链...原创 2020-03-07 14:56:38 · 190 阅读 · 0 评论 -
基于jdk1.8 的ArrayList的源码分析
基于jdk1.8 的ArrayList的源码分析前言:一说到ArrayList的大家可能立马想到的就是:有序、可重复、查找快但是增删慢、线程不安全。但是具体的原因都不是很清楚,本文就会根据这些问题和大家一起去学习。主要会从ArrayList的构造方法、增加元素、删除元素、获取元素、查询元素、清空元素、判断元素是否存在以及ArrayList的遍历进行入手分析。一:ArrayList的具体实现1...原创 2020-03-03 17:46:53 · 291 阅读 · 1 评论 -
java.lang.Exception: Socket bind failed java.net.BindException: Address already in use: JVM_Bind
废话不多少说,一般出现这种情况基本都是端口被占用了导致的,至于端口被占用的原因,又可能是服务已经起过一次,还有就是别的服务已经占用了该端口。两种解决方案:第一种,kill掉占用的端口服务;<p>1.查看指定端口的占用情况 netstat -aon|findstr "8080" 2.查看PID对应的进程 tasklist|findstr "PID" 3.结束该进...原创 2019-10-12 08:58:16 · 640 阅读 · 0 评论 -
JAVA中数组和集合排序的小方法
学习过程中,经常需要对集合或者数组中的元素进行排序,这里总结如下:思想:先获取元素,然后进行比较,最后换位置代码如下:package sort;import java.util.ArrayList;import java.util.List;public class Sort { public static void main(String[] args) { List<In...原创 2018-04-30 20:29:54 · 472 阅读 · 0 评论 -
JAVA中集合去重的三种基本方式
在学习JAVA的过程中,总是会碰见对集合中的元素进行去重的要求,在这里总结了三种基本的去重方法.主要的思想就是:先取元素,后进行比较,最后放回去.案例如下:package eliminate_duplicate;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.uti...原创 2018-04-30 19:30:04 · 20330 阅读 · 2 评论