![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java编程拾遗
文章平均质量分 85
卓立~
现在一家电商做广告平台,Java后端后端开发
展开
-
Java编程拾遗『JVM内存区域』
作为一名Java开发人员,JVM是我们每天都会打交道的对象。但是由于JVM处于知识体系的底层,同时工作中有可能接触的机会不是很多,导致很多人都对JVM相关的知识一知半解。一般只会在面试的时候,才来准备这部分内容。但JVM是为了让我们更好的理解Java,更深入了解我们每天开发程序的执行机制。所以从本篇文章开始,我们来介绍以下JVM相关的知识。大致规划一下应该会包括 以下内容:JVM内存区域、垃圾...原创 2020-01-07 07:43:15 · 208 阅读 · 0 评论 -
Java编程拾遗『Java ClassLoaser工作机制』
ClassLoader顾名思义就是类加载器,负责将类的.class文件中的二进制数据加载到JVM中,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构(类的方法代码,变量名,方法名,访问权限,返回值等)。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加...原创 2020-01-07 07:41:48 · 325 阅读 · 0 评论 -
Java编程拾遗『ThreadLocal』
本篇文章,我们来介绍一下,Java多线程编程中一个比较常用的工具,线程本地变量——ThreadLocal。ThreadLocal简单的来讲,就是每个线程都有同一个成员变量的独有拷贝。由于每个线程都有成员变量独立的拷贝,所以不存在多线程访问同一成员变量的问题,也就解决了线程安全问题。之前我们介绍的锁,是解决线程安全问题的一个途径,那么本篇文章介绍的线程本地变量是另一种解决线程安全问题的思想,就是通过...原创 2020-01-07 07:39:31 · 217 阅读 · 0 评论 -
Java编程拾遗『线程协作工具』
在之前的文章Java编程拾遗『线程协作』中,介绍了一些线程协作的场景,并做了简单的代码实现,比如上文中的MyLatch、AssemblePoint、MySemaphore等。其实上篇文章介绍的线程协作场景,在Java API中都有响应实现。本篇文章就来介绍一下,Java API中提供的一些线程协作工具及使用场景。本篇文章会介绍以下几种协作工具:CountDownLatch CyclicBar...原创 2020-01-07 07:38:05 · 225 阅读 · 0 评论 -
Java编程拾遗『线程池』
在之前的文章中,我们已经讲了很多Java线程的使用以及Java并发编程的原理,本篇文章,我们来重点看一下Java并发编程中一个比较常用的工具——线程池的使用以及源码实现,这也是Java面试的基本问题。在使用线程池之前,我们可以尝试考虑这样一个问题,如果没有线程池,我们是怎样实现多线程编程的以及实现方式有哪些问题?首先,如果没有线程池,我们一般会直接通过new Thread()构造出多个线程,然...原创 2020-01-07 07:36:59 · 225 阅读 · 0 评论 -
Java编程拾遗『并发容器——并发队列』
本篇文章,来探讨一下Java并发包中的各种队列。Java并发包提供了丰富的队列类,可以简单分为:无锁非阻塞并发队列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞队列:基于数组的ArrayBlockingQueue,基于链表的LinkedBlockingQueue和LinkedBlockingDeque 优先级阻塞队列:PriorityBl...原创 2020-01-07 07:34:15 · 162 阅读 · 0 评论 -
Java编程拾遗『并发容器——ConcurrentSkipListSet和ConcurrentSkipListMap』
由于水平有限,ConcurrentSkipListSet和ConcurrentSkipListMap的实现又比较复杂,所以并没有去通读源码。下文的内容来自《Java编程的逻辑》,简单讲了ConcurrentSkipListMap基于跳跃表实现的思想,有兴趣的小伙伴也可以去读一下源码。之前的文章介绍了ConcurrentHashMap,也讲到ConcurrentHashMap不能排序,容器类中可...原创 2020-01-07 07:32:34 · 335 阅读 · 0 评论 -
Java编程拾遗『并发容器——ConcurrentHashMap』
在之前的文章中已经介绍过的哈希表数据结构有HashMap、TreeMap、LinkedHashMap、HashTable以及Collections类生成的各种同步Hash容器。但是我们也了解到,HashMap是非线程安全的,在多线程环境下会出现数据安全性问题,比如多线程同时rehash过程中产生的死循环(Java7)及元素丢失问题。HashTable和Collections类生成的同步容器倒是可以...原创 2020-01-05 10:42:43 · 243 阅读 · 0 评论 -
Java编程拾遗『并发容器——CopyOnWrite』
从本片文章开始我们来介绍并发容器类,之前的文章介绍过普通容器类,比如ArrayList、LinkedList等。但是这些容器都有个问题,就是非线程安全,多线程并发写,会存在线程安全问题,所以Java提供了并发容器类来解决普通容器类的线程安全问题。本篇文章我们先来看一种解决容器类线程安全的思想——CopyOnWrite(写时复制)。1. 同步容器在讲CopyOnWrite并发容器之前,先来介...原创 2020-01-05 10:36:47 · 229 阅读 · 0 评论 -
Java编程拾遗『EnumMap』
到本文为止,之前已经介绍过HashMap、TreeMap、LinkedHashMap,本篇文章介绍一下集合框架系列最后一种类型的Map——EnumMap。在之前的文章中,我曾介绍过Java API中枚举类的本质(Java编程拾遗『枚举类』),本文讲的EnumMap就是一种key为枚举类型的Map结构。EnumMap类的继承关系如下:Enum类继承了AbstractMap抽象类,在EnumM...原创 2019-01-29 10:37:54 · 2204 阅读 · 0 评论 -
Java编程拾遗『线程的使用』
上篇文章讲了一些关于并发编程的一些基本概念,也简单提到Java中线程的创建方式,本篇文章将详细介绍一下Java中线程使用的相关细节。1. 创建线程如果程序中只有一条执行流,程序从main方法的第一条语句逐条执行直到结束。如果在main线程中创建另外创建一个线程,并启动,则表示在main执行流之外另外开辟一条单独的执行流,它有自己的程序执行计数器,有自己的栈。Java中可以通过三种方式创建线...原创 2019-08-15 07:16:37 · 201 阅读 · 0 评论 -
Java编程拾遗『并发编程概述』
从本篇文章开始,我们一起来认识一下Java并发编程的相关细节。如果让你写一个多线程程序,相信绝大多数开发人员都能很轻松的实现。但是对于Java并发编程的一些细节,比如线程多个状态的流转、线程安全保证的原理、线程池的实现等等,综合考虑起来还是有很多知识的,我现在也不能完全搞明白,刚好在并发编程这个系列中,整理一下Java并发编程的一些细节,希望对理解Java并发编程带来一些帮助。1. Java并...原创 2019-08-14 07:35:03 · 191 阅读 · 0 评论 -
Java编程拾遗『序列化』
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,也就是讲这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,有可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。上节讲字节流的时候,讲了通过DataOutputStream/DataInputSt...原创 2019-08-14 07:33:43 · 293 阅读 · 0 评论 -
Java编程拾遗『字符流』
之前一篇文章讲述了Java中字节流的分类及简单用法,最后我们可以发现,Java中的字节流既可以用来处理二进制文件,也可以用来处理文本文件。但是字节流对于文本文件的处理是不太方便的,比如字节流的媒介是字节,但是文本文件的内容都是可显式地字符,很明显通过字符作为媒介更合理(需要手动进行字节和字符通过某种特定编码格式的转化)。另外,在之前那篇文章Java编程拾遗『搞定编码』中,我们了解到,字符可以有很多...原创 2019-08-14 07:32:42 · 176 阅读 · 0 评论 -
彻底搞懂动态代理
生活中我们肯定知道代理商的概念,代理商代替厂家售卖其生产的商品,厂家“委托”代理商为其销售商品。通过代理商这种销售模式,普通消费者是不直接跟厂家打交道,但是却能获得厂家的商品服务,也就是说,“委托者”对普通消费者来说是不可见的。其次,同一厂家的不同代理商,可以针对自身的情况做一些个性化的营销策略,消费者通过代理商获取不同的服务,但代理商并没有改变厂家的任何策略。我们把代理商和厂家进行抽象,前者可抽...原创 2019-08-14 07:31:45 · 488 阅读 · 0 评论 -
Java编程拾遗『字节流』
上篇文章中简单介绍了文件和Java IO的概念,我们了解到Java中文件是作为一种特殊的IO设备处理的,并且Java中处理IO是通过流来操作的,流又可以细分为字节流和字符流。本篇文章就重点介绍一下Java IO中的一个重要模块——字节流。字节流的继承体系如下图所示:本文重点介绍如下几种字节流:InputStream/OutputStream: 基类,抽象类。 ByteArrayInp...原创 2019-08-14 07:28:11 · 404 阅读 · 0 评论 -
Java编程拾遗『文件和IO概述』
从本文开始,讲述Java中文件和IO的相关知识。在做企业web开发时,文件操作相对涉及的比较少,在桌面系统开发中比较常见。正因如此,导致很多人对文本文件、二进制文件、字节流、字符流等概念性的东西都不能完全搞清楚。其实在我在写这篇文章之前,也是分不清的,但是因为日常工作中也很少涉及相关的内容,所以一直也没深究。本篇文章就来科普一下一些基本概念,同时介绍一下Java IO体系。1. 基本概念1...原创 2019-08-14 07:26:59 · 161 阅读 · 0 评论 -
Java编程拾遗『EnumSet』
上篇文章讲了EnumMap的实现,本篇文章按照惯例,介绍一下存储枚举类型集合Set类——EnumSet。但是跟之前HashSet和HashMap、TreeSet和TreeMap的关系不同,EnumSet不是依靠EnumMap实现的,甚至可以讲,实现方式跟EnumMap完全没有关系。另外和HashSet、TreeSet不同的是,EnumSet是抽象类,而HashSet、TreeSet是非抽象的。En...原创 2019-08-14 07:17:17 · 573 阅读 · 0 评论 -
Java编程拾遗『synchronized使用』
从接触Java多线程第一刻起,我们就被告知使用多线程编程一定要注意线程安全问题。而一般的教材中都会首先给出解决线程安全问题的“万金油”——关键字synchronized,它可以保证同一时刻只有一个线程在访问其修饰的代码。但是同时,一般教程中会告诉我们,synchronized是一个重量级锁,以至于给我们一种印象,synchronized效率极低,甚至“谈synchronized”色变。在日常开发中...原创 2019-08-15 07:19:31 · 156 阅读 · 0 评论 -
Netty基础篇:Netty是什么?
之前了解过NIO、和Netty的一些概念,但是感觉概念上很晦涩,只是了解简单的概念,也不知道具体该怎么应用。大多数博客讲述的也不是很清楚,昨天一个偶然的机会,读到一个博主的系列文章,感觉写的很好,这里分享一下。原文链接:《跟闪电侠学Netty》开篇:Netty是什么?同时博主还有一个关于Netty的掘金小测,配合Netty的相关书籍食用更搭配。《Netty 入门与实战:仿写微信 IM 即时...转载 2019-08-15 07:22:10 · 183 阅读 · 0 评论 -
Java编程拾遗『异常体系』
异常是指程序运行时(非编译时)所发生的非正常情况或错误比如空引用、数组越界、内存溢出等,这些都属于程序运行过程中的意外情况。当程序违反了语义规则时,JVM就会将出现的错误表现为一个异常并抛出,假如对这些异常置之不理,就会导致程序终止或者直接系统崩溃,所以Java中提供了一套异常机制来进行异常处理,从而提高程序的安全性和健壮性。Java中把异常当作对象来处理,并定义了一个基类(java.lang...原创 2018-11-07 07:33:35 · 174 阅读 · 0 评论 -
Java编程拾遗『并发容器——CopyOnWrite』
CopyOnWrite原创 2019-08-16 07:21:37 · 132 阅读 · 0 评论 -
Java编程拾遗『AQS』
上篇文章讲了Java中显式锁Lock和ReadWriteLock的概念及简单使用示例,本篇文章重点来看一下Java中显式锁的底层实现。在看这部分代码时,我任务比较好理解的方式是带着问题去看源码。对于显式锁,我们可能会有以下问题:问题1:显式锁底层是基于CAS实现,细节是怎样的? 问题2:显式锁跟synchronized类似,无法获取锁时,会阻塞当前线程,如何实现阻塞的? 问题3:显式锁提供...原创 2019-08-16 07:19:59 · 216 阅读 · 0 评论 -
Java编程拾遗『显式锁』
在之前讲线程同步时,介绍了synchronized的锁的使用及底层原理,也介绍了synchronized锁的一些使用局限,本篇文章来介绍一下Java中提供的另一种线程同步机制——显式锁。Java并发包中的显式锁接口和类位于包java.util.concurrent.locks下,主要接口和类有:锁接口Lock,主要实现类是ReentrantLock 读写锁接口ReadWriteLock,主要...原创 2019-08-16 07:17:57 · 158 阅读 · 0 评论 -
Java编程拾遗『原子变量』
本篇文章我们来讲java.util.concurrent包下的原子变量,原子变量的引入主要是为了解决普通变量(int、Integer、Long等)修改操作不是原子的,进而导致必须使用同步机制才能保证安全更新的问题。举个例子:public class Counter { private int count; public void incr(){ count ...原创 2019-08-16 07:16:12 · 368 阅读 · 0 评论 -
Java编程拾遗『线程中断』
之前的文章,我们已经介绍了线程的概念、使用、同步及线程协作,本篇文章来重点讲一下Java中如何取消或关闭一个线程。1. 线程取消/关闭的场景我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种情况,比如说:很多线程的运行模式是死循环,比如在生产者/消费者模式中,消费者主体就是一个死循环,它不停的从队...原创 2019-08-16 07:14:25 · 167 阅读 · 0 评论 -
Java编程拾遗『线程协作』
之前用了两篇文章介绍了多个线程竞争资源的解决方案synchronized,但其实多个线程之间除了竞争资源之外,还有相互协作。比如:生产者/消费者模式:这是一种常见的协作模式,生产者线程和消费者线程通过共享队列进行协作,生产者将数据或任务放到队列上,而消费者从队列上取数据或任务,如果队列长度有限,在队列满的时候,生产者需要等待,而在队列为空的时候,消费者需要等待。 同时开始:类似运动员比赛,在...原创 2019-08-16 07:13:16 · 168 阅读 · 0 评论 -
redis实现分布式锁
分布式锁一般有三种实现方式:Zookeeper Redis 数据库排他锁从可靠性和实现的复杂度讲,上面三种方式在可靠性上逐渐降低,在实现复杂度上也是逐渐降低的。在实际使用中,通过redis实现分布式锁是一种比较常见的方式,但是在使用redis实现分布式锁时,有些不正确的实现往往会导致死锁,错误等问题。本篇文章就来讲解一下redis实现分布式锁的常见方式,及redis分布式锁的正确打开方式...原创 2019-08-15 07:26:12 · 231 阅读 · 0 评论 -
Java编程拾遗『synchronized原理』
上篇文章简单介绍了一下synchronized的使用,以及对象锁和类锁的概念,本篇文章就来介绍一下synchronized的底层原理。上篇文章也提到,我们对synchronized的印象是重量级锁,使用效率低下,导致我们一般在使用synchronized有很多顾虑。但是随着Java6对synchronized进行的各种优化后,synchronized并不会显得那么重了。本篇文章就synchro...原创 2019-08-15 07:25:08 · 235 阅读 · 0 评论 -
Java编程拾遗『LinkedHashSet』
根据之前讲HashSet和HashMap的关系,TreeSet和TreeMap的关系,我们也能猜测出来LinkedHashSet肯定也是通过LinkedHashMap实现的,只是LinkedHashMap所有键值对的value都是一个特定的值,所有的key便组成了LinkedHashSet的所有集合元素,并能保证所有的集合元素按插入有序。LinkedHashSet类的继承关系如下图所示:可...原创 2019-01-29 10:36:59 · 204 阅读 · 0 评论 -
Java编程拾遗『LinkedHashMap』
在之前的文章,分别介绍过HashMap、TreeMap。HashMap就是普通的K-V存储数据结构,TreeMap在K-V存储数据结构的基础上添加了K-V之间按键值有序的特性。本篇文章来介绍一下,另一种特殊的K-V存储数据结构LinkedHashMap。LinkedHashMap是HashMap的子类,但可以保持元素按插入或访问有序(默认是按插入顺序有序)。LinkedHashMap继承关系如下:...原创 2019-01-29 10:36:07 · 380 阅读 · 0 评论 -
Java编程拾遗『Java基本数据类型』
Java是一种强类型的语言,这就意味着必须为每一个变量声明一种变量类型。在Java中,一共存在8种基本数据类型,其中4种整型、2种浮点型、1种用于表示Unicode编码的字符单元的自负类型char和一种用于表示真值的bollean类型。1. 数据类型1.1 整型类型 大小 取值范围 byte 1字节 -128 ~ 127 short 2字节 ...原创 2018-11-06 07:04:37 · 139 阅读 · 0 评论 -
Java编程拾遗『Java概述』
Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。1. Java语言概述任职于Sun的Jams Gosling等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的编程语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Su...原创 2018-11-06 07:02:41 · 446 阅读 · 0 评论 -
Java编程拾遗
在学校时,从未接触过Java编程相关的东西,开始工作的前半年多的时间亦然。后来一些偶然的原因,我做了个决定,做一名Java程序员。在计算机这个领域,非常盛行这么一句话,编程都是相通的,当你熟悉一门开发语言之后,再去转其他语言是很简单的。但是我当时从零开始学Java的过程并不是很顺利,自己一度非常迷茫。后来我体会到“编程都是相通的”这句话的含义,它是有前提的,那就是对当前使用的这门语言的“熟悉”程度...原创 2018-11-06 07:01:58 · 159 阅读 · 0 评论 -
Java编程拾遗『final详解』
之前讲String类的时候,讲了String类是不可变类,其实现方式中有一个重要的保障是final—final修饰class以及final修饰了内部成员变量char[]。本文会详细讲一下final的使用场景以及使用final的好处。1. final的基本用法final是Java中的一个关键字,可以用来声明类、变量、方法和方法参数,分别表示类不可继承、成员变量引用不可改变、方法不可不该以及参...原创 2019-01-29 10:23:41 · 194 阅读 · 1 评论 -
Java编程拾遗『StringBuilder和StringBuffer』
在之前的文章中,我讲了String类,在讲intern那一节中,讲到当String实例使用”+”操作时,编译后其实使用的是通过StringBuilder的append实现的。另外我们都知道String是不可变类,每次对String实例进行改变的时候,都会生成一个新的String实例,然后将引用指向新的String实例,所以经常改变内容的字符串最好不要用String ,因为每次生成对象都会对系统性能...原创 2018-11-07 07:35:44 · 145 阅读 · 0 评论 -
Java编程拾遗『搞定编码』
提到编码,也许很多人都有概念,就是普通字符转化位计算机能识别的二进制码的过程。但是具体到各种字符集,编码方式,为什么会有这些编码方式,再到Unicode和UTF-8、UTF-16是什么关系,相信很多人都答不上来。字符集和编码也是很多人比较头疼的问题,我一度也搞不明白。直到之前写String类那篇文章,读了Character源码,并查阅了一堆资料,才真正搞懂编码的来龙去脉,搞明白字符是如何在计算机和...原创 2018-11-07 07:34:48 · 301 阅读 · 0 评论 -
Java编程拾遗『String类』
从概念上讲,Java字符串就是Unicode字符序列。例如,串“Java\u2122”由5个Unicode字符J、a、v、a和TM。每个用双引号括起来的字符串都是String类的一个实例:String e = ""; //空字符串String greeting = "hello"; 1. Java API String常用方法在Java API中,String定义如下:pub...原创 2018-11-07 07:32:53 · 197 阅读 · 0 评论 -
Java编程拾遗『static详解』
static关键字在开发中是比较常见的,但是很多人对其都没有一个明确的认识,只有一种比较模糊的概念,甚至不知道该怎么用。本篇文章将总结一下,Java中static关键词的用法。首先来看一下static关键字的作用:为特定的数据类型或对象分配单一的存储空间,而与创建对象的个数无关 实现某个方法或属性与类而不是对象关联在一起,也就是将方法或属性是属于类的,可以通过类名直接访问,而不用借助于对象。...原创 2018-11-07 07:32:07 · 173 阅读 · 0 评论 -
Java编程拾遗『内部类』
上篇文章讲述了Java中两种特殊的”类”—接口和对象,本篇文章将讲述一下Java中另一种特殊的类—内部类的相关细节。内部类是相对于普通类来讲的,是指定义在一个类内部的类,而包含它的类则称为外部类。一般来讲,内部类和外部类都有着比较密切的联系,同时和其它类的关系并不是很大,定义在类内部,可以实现对外的隐藏,可以更好地封装。但是内部类只是Java编译器的概念,对于Java虚拟机而言,它并不知道内部类的...原创 2018-11-07 07:31:26 · 161 阅读 · 0 评论