
java技术
文章平均质量分 82
miaomiaoLoveCode
这个作者很懒,什么都没留下…
展开
-
java8中的Stream
java8提出的函数式编程旨在帮助程序猿们写出更优雅的代码,上文函数式编程基础也介绍了java8新提出的一些函数式接口,通过它们代码貌似已经简洁了一波,但是,代码其实还可以更简洁下,接下来就要开始给大家介绍另一个神器了:Stream,通过它可以进一步利用函数式接口来简化代码了。 注:Stream是java8核心类库中新引入API,它使程序猿们站在更高的抽象层次上对集合进行操作。常用的...原创 2018-08-27 18:18:40 · 321 阅读 · 0 评论 -
java并发编程之FutureTask
引言FutureTask实现了接口Future,同Future一样,代表异步计算的结果。当然,FutureTask除了实现Future接口之外,还实现了Runnable接口,所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行。FutureTask状态根据FutureTask的run方法是否被执行以及是否被执行完成,FutureT原创 2017-02-16 13:59:16 · 2670 阅读 · 0 评论 -
java并发编程之Condition
引言在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout),notify(),notifyAll(),这些方法配合synchronized关键字一起使用可以实现等待/通知模式。同样,Condition接口也提供了类似Object监视器的方法,通过与Lock配合来实现等待/通知模式。为了更好的了解C原创 2016-12-30 16:51:12 · 502 阅读 · 0 评论 -
java并发编程之LockSupport
LockSupport,构建同步组件的基础工具,帮AQS完成相应线程的阻塞或者唤醒的工作。LockSupport源码分析LockSupport定义了一组以park开头的方法来阻塞当前线程,unpark来唤醒被阻塞的线程。阻塞线程park()实现public static void park() { UNSAFE.park(false, 0L);}调用native方法阻塞当前线程。pa原创 2016-12-29 16:32:01 · 615 阅读 · 1 评论 -
java并发编程之Lock接口
引言锁,是java se 5之后提出的,它同synchronized关键字一样,都是用来控制多个线程对临界区访问的。Lock与synchronized之间的区别和联系 在总结两者的区别和联系之前先引入两个概念:隐式锁和显式锁。隐式锁:隐式获取锁,synchronized是它的代表,使用者不需要关心其内部锁的获取和释放,所有的锁的相关操作都由具体的关键字完成;显式锁:显示地获取锁,Lock是它的原创 2017-01-04 18:47:01 · 677 阅读 · 0 评论 -
java中的读写锁
引言锁(Lock)是java一个很重要的同步组件,Lock提供了跟synchronized关键字一样的功能,相比synchronized更加灵活,但是实现也更加复杂。锁的分类: 锁主要分为排他锁和读写锁。排他锁:在同一时刻只允许一个线程进行访问,其他线程等待;读写锁:在同一时刻允许多个读线程访问,但是当写线程访问,所有的写线程和读线程均被阻塞。读写锁维护了一个读锁加一个写锁,通过读写锁分离的模原创 2016-12-27 00:06:42 · 638 阅读 · 0 评论 -
java并发编程之AbstractQueuedSynchronizer
引言AbstractQueuedSynchronizer,队列同步器,简称AQS,它是java并发用来构建锁或者其他同步组件的基础框架。一般使用AQS的主要方式是继承,子类通过实现它提供的抽象方法来管理同步状态,主要管理的方式是通过tryAcquire和tryRelease类似的方法来操作状态,同时,AQS提供以下线程安全的方法来对状态进行操作:protected final int getStat原创 2016-12-15 15:58:14 · 596 阅读 · 0 评论 -
ThreadLocal源码解析
引言ThreadLocal,线程变量,线程可以将本次线程内经常使用的变量存储到ThreadLocal中,方便本次线程内其他的操作使用。注:特别需要注意的是,有些博客说ThreadLocal可以保证线程安全,这是错误的认识,ThreadLocal存储的只是每一个线程的本地变量,并未涉及到临界区,不能保证线程安全。在使用的时候一定要注意使用场景,ThreadLocal存储的应该是每个线程内部共享的一些数原创 2016-12-08 14:58:04 · 665 阅读 · 0 评论 -
Thread源码解析
引言在介绍Thread源码之前先简要介绍一下线程相关的一些基础知识。线程定义线程是现代操作系统调度的最小单元,一个进程可以创建多个线程来提高系统的吞吐量和执行效率。注:进程是操作系统资源分配和调度的基本单位,它可以创建多个线程,进程可创建的线程数量跟操作系统相关。为什么要使用多线程?更多的处理器核心;更快的响应时间;更好的编程模型:java提供了一套完整的jmm规则,屏蔽了底层的一些操作,开发原创 2016-12-07 19:19:19 · 1045 阅读 · 0 评论 -
java并发编程之Semaphore
Semaphore,信号量,一般用来控制同时访问特定共享资源的线程数,它通过协调各个线程来保证使用公共资源的合理性。应用场景Semaphore,从字面上其实不太好理解它的意思,换个通俗易懂的比喻吧,Semaphore就好比是马路上控制流量的红绿灯。比如上地五街,需要限流,只允许同时有100辆车通过,其他的车辆都必须在路口等待,所以对于前100辆车,它们将会看到绿灯,可以开进这条马路,后面的车会看到红原创 2017-02-09 12:34:29 · 382 阅读 · 0 评论 -
java并发编程之ConcurrentHashMap
引言ConcurrentHashMap是线程安全并且高效的HashMap,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入jdk的。为什么引入ConcurrentHashMap?HashMap线程不安全,它的线程不安全主要发生在put等对HashEntry有直接写操作的地方: 从put操作的源码不难看出,线程不安全主要可能发生在这两个地方:key已原创 2017-01-19 12:08:06 · 727 阅读 · 1 评论 -
java并发编程之CompletionService
应用场景当向Executor提交多个任务并且希望获得它们在完成之后的结果,如果用FutureTask,可以循环获取task,并调用get方法去获取task执行结果,但是如果task还未完成,获取结果的线程将阻塞直到task完成,由于不知道哪个task优先执行完毕,使用这种方式效率不会很高。在jdk5时候提出接口CompletionService,它整合了Executor和BlockingQueue的原创 2017-02-20 17:58:56 · 5690 阅读 · 1 评论 -
函数式编程基础
前言何谓函数式编程编程语言主要有三种类型: 1. 命令式编程:专注于“如何去做”,所有的事情都按照你的命令去做; 2. 函数式编程:把运算的过程尽量表现成一系列的嵌套函数调用,相比命令式编程关心解决问题的步骤,它更关心数据之间的映射关系,是面向数学的抽象; 3. 逻辑式编程:它通过设定答案必须符合的规则来解决问题,过程是事实加上规则就等于最后的结果。函数式编程并不是java提...原创 2018-08-27 18:16:09 · 305 阅读 · 0 评论 -
java并发之ReentrantLock
ReentrantLock,可重入锁,支持一个线程对公有资源重复加锁。当然,ReentrantLock还支持公平性的获取锁和非公平性的获取锁。 注:何谓获取锁的公平性? 每一个线程在获取锁的时候可能都会排队等待,如果在等待时间上,先获取锁的线程的请求一定先被满足,那么这个锁就是公平的。反之,这个锁就是不公平的。公平的获取锁,也就是当前等待时间最长的线程先获取锁。接下来就源码对Reentr原创 2017-05-08 18:38:25 · 597 阅读 · 0 评论 -
JVM之Java内存区域
对于从事C系列程序员来说,他们既拥有每一个对象的所有权,又担负着维护每一个对象生命周期。但是对于Java程序员来说,JVM帮忙管理了每一个对象的内存使用,程序员们不需要再花时间为每一个new操作配对一个delete或者free操作,这样子不太会因为程序员们的误操作而出现内存泄漏等问题。看起来,JVM的内存管理很美好,但是,正是因为JVM掌握了内存的控制权,一旦出现内存泄漏和内存溢出方面的问题,如果程原创 2017-04-05 19:07:12 · 352 阅读 · 0 评论 -
垃圾回收基础
垃圾回收(Garbage Collection,GC)是虚拟机内存管理很重要的一个模块,它帮助虚拟机在技术层面上做到了内存动态分配后的回收。垃圾回收主要发生在线程公有的区域。GC主要完成这样三件事情:确定哪些内存需要回收;确定待回收的内存在何时回收;如何来做垃圾回收。接下来就以如何做这三件事情为切入点,详细介绍一下GC的相关基础。 注:为什么垃圾回收发生在线程公有区域? 私有区域会原创 2017-04-12 11:03:23 · 439 阅读 · 0 评论 -
java并发之synchronized
synchronized,在java并发编程中它一直都是元老级的角色。但是在大多数时候,如果能使用Lock大家可能都不会使用它,因为它是个重量级锁。但是随着jdk6引入偏向锁和轻量级锁,对它进行了各种优化之后,在一些情况下它并不是那么重了。本文将结合HotSpot 1.7源码,详细分析jdk6做出的相关优化。synchronized实现分析在开始分析synchronized具体实现之前,先了解一下j原创 2017-03-14 10:43:13 · 705 阅读 · 1 评论 -
java并发编程之原子类
当多个线程同时更新公共变量,会导致线程不安全,通常大家可以会想到使用synchronized关键字或者Lock来解决这个问题,synchronized和Lock可以保证多个线程不会同时更新该公共变量。为了使用更简单,性能更高效,jdk1.5提出原子操作类。原子操作类主要集中在Atomic(java.util.concurrent.atomic)包下,按照原子更新方式,这些原子操作类大致可以分为四种:原创 2017-02-24 13:42:47 · 1271 阅读 · 1 评论 -
ScheduledThreadPoolExecutor源码解析
ScheduledThreadPoolExecutor主要用来定期执行任务,或者是在给定的延迟之后运行任务。它的功能与Timer类似,但是比起Timer,ScheduledThreadPoolExecutor功能更强大,使用也更灵活。ScheduledThreadPoolExecutor与Timer区别:Timer对应单个后台线程,所有的任务都由同一个线程调度,因此所有的任务都是串行执行的,前一个原创 2017-02-14 18:59:54 · 1882 阅读 · 0 评论 -
java并发编程之CountDownLatch与CyclicBarrier
CountDownLatch和CyclicBarrier是jdk concurrent包下非常有用的两个并发工具类,它们提供了一种控制并发流程的手段。本文将会提供一些应用场景,结合源码,对它们的具体实现以及如何使用做一个具体分析。CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch使用案例需求:解析一个文件下多个txt文件数据,原创 2017-01-23 13:12:14 · 6123 阅读 · 0 评论 -
ThreadPoolExecutor源码分析
引言为什么引入线程池技术?对于服务端的程序,经常面对的是执行时间较短、工作内容较为单一的任务,需要服务端快速处理并返回接口。假若服务端每次接收到一个任务,就创建一个线程,然后执行,这种方式在原型阶段是不错的选择,但是面对成千上万的任务提交进服务器时,这个时候将会创建数以万记的线程,这很明显不是一个好的选择。为什么呢? - 第一,频繁的线程切换会使操作系统频繁的进行上下文切换,增加了系统的负载;原创 2016-12-13 10:51:38 · 2588 阅读 · 0 评论 -
ReentrantLock源码解析
引言相信接触过java并发编程的对锁都不陌生,reentrantLock是锁的一种,可重入锁,本文将给出ReentrantLock的具体使用和相关源码分析。先看具体的使用吧:public class ReentrantLockTest { private static int number = 0; ReentrantLock reentrantLock = new ReentrantL原创 2016-12-01 15:20:26 · 572 阅读 · 0 评论 -
Design Review 中应该考虑的问题
Design Review 是我们开发过程中至关重要的一环,一个好的Design review不但能让我们的技术方案考虑的更加周全,更多时候还可以大大节省我们的工作量,并减少未来的线上Bug以及不必要的反复修改。Design Review的过程中需要考虑的问题涉及方方面面,下面是我们在这个环节经常问的一些问题,虽然我们不是每个项目都会涉及到下面所有的这些点,而且我们也不应该被这些问题所局限转载 2016-09-28 15:27:02 · 3161 阅读 · 0 评论 -
设计模式-抽象工厂模式
引言如果有看完前两篇简单工厂模式和工厂方法模式,相信读者心里多少都有一些困惑,简单工厂模式是有一些不足之处,但是在工厂方法模式以及把那些不足之处都改进了,工厂方法模式已经是工厂模式的一个较好的应用,为什么还要引入抽象工厂呢?这么多的工厂,遇到实际问题的时候我该怎么来决定我到底使用哪种比较合适呢?接下来就来详细说说引入抽象工厂的真正的用意到底是什么。引入抽象工厂的用意是什么?原创 2016-11-03 17:06:00 · 426 阅读 · 0 评论 -
设计模式-观察者模式
前言先简要说说观察者模式的定义与组成吧。观察者模式定于与组成通俗来讲,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态上发生变化时,通知所有观察者对象,让它们可以主动的更新自己。观察者模式主要分为四部分:抽象主题角色;抽象观察者角色;具体主题角色;具体观察者角色。接下来看看我自定义的观察者模式吧。自定义观察者模式原创 2016-09-26 16:37:20 · 450 阅读 · 0 评论 -
HashBiMap源码解析
HashBiMap源码:首先看看HashBiMap到底是一个什么样的类,它继承了哪些类。public final class HashBiMap extends AbstractMap implements BiMap, Serializable 由上面的代码可以看出,HashBiMap是AbstractMap的子类,BiMap的子接口,并且实现了Serializabl原创 2015-08-04 16:15:19 · 1290 阅读 · 0 评论 -
BiMap源码解析
BiMap是Guava类库中提供的一种数据类型。接下来我们看看它的源码是怎么实现的。BiMap源码:package asdf;/** * Created by ping.miao on 2015/8/4. */public interface BiMap extends Map { /** * BiMap是一种支持key与value反转的数据类型 *原创 2015-08-04 15:45:21 · 872 阅读 · 0 评论 -
HashMap源码解析
HashMap源码:首先看看HashMap到底是一个什么样的类,它继承了哪些类。public class HashMap extends AbstractMap implements Map, Cloneable, Serializable由上面HashMap头部可以看到,HashMap是AbstractMap的子类、Map的子接口,并且实现了其他的一些额外的东西,Cl原创 2015-08-03 11:16:35 · 480 阅读 · 0 评论 -
java Map接口源码分析
Map接口:map接口提供了存储“键值对”的存储方法,在map中,key的值是唯一的,也就是key的值不能重复。Map源码:package asdf;import java.util.*;/** * Created by ping.miao on 2015/8/3. * Map接口源码分析 * */public interface Map { /**原创 2015-08-03 10:22:24 · 659 阅读 · 0 评论 -
java Collection源码解析
Collection接口是最基本的容器结构,继承至Iterable接口。在jdk中,它并没有提供实现Collection接口的实体类,它提供了更具体的子接口List和Set。接下来来具体看看Collection的源码。Collection源码:package asdf;/** * Created by ping.miao on 2015/7/29. * Collection接口源码原创 2015-08-03 10:12:41 · 851 阅读 · 0 评论 -
系统设计过程
需求分析前: 理清楚目标是什么理解项目背景与目的, 这个一定要理解清楚这个上下文后来的需求都是为了完成背景设置的目的而努力的PM找你聊需求,不要忘记这个初心需求分析:理清楚职责是什么, 边界在哪里职责与边界, 推荐阅读 DDD 需求分析后: 理清楚系统非功能性需求非功能性需求是指性能,可用性,监控等等针对已经分析好的需求场景中, 会碰原创 2016-09-28 16:46:55 · 940 阅读 · 0 评论 -
工程质量的一些实践
一些共性实践按照通常的产品研发过程,我们大约要经历如下几个阶段:需求 -> 设计 -> 开发 -> 测试 -> 上线 -> 维护,下面针对这些阶段分别提出一些建议 (着急的同学可以直接跳到最后的归纳部分,对感兴趣的内容再跳回来读 )需求阶段需求文档(Recommended):在我过往的项目中,以及周五会议的总结中,我都看到有不少问题是需求和实现不一致造成的,因此这里我的建议转载 2016-09-28 15:42:03 · 416 阅读 · 0 评论 -
设计模式-单例模式
引言单例模式,这个名字大家绝对是耳熟能详。作为对象的创建模式,单例模式实质上是为了确保某一个类它只有一个实例,并且自行实例化向整个系统提供这个实例。单例模式的要点单例模式的要点有三个,这也是我们在设计单例模式时需要注意的几点:单例类在整个系统的运行过程中只能有一个实例;单例类必须要自行来创建实例(换句话说,在Java中就是不对外暴露构造方法,不能由其他的对象来做实例原创 2016-11-07 16:08:31 · 419 阅读 · 0 评论 -
设计模式-策略模式
前言还是按照惯例先说说策略模式的定义、结构。策略模式定义策略模式属于对象的行为模式。它的用意是针对一组算法,讲每一个算法封装到具有共同接口的独立的类中国,从而使他们可以相互替换。它可以使得算法可以在不影响客户端的情况下发生变化。策略模式的结构:策略模式又被叫做政策模式,举个简单的demo就可以完全了解策略模式的结构。从上图可以看出,这个模式涉及到三个角色:原创 2016-10-25 17:15:49 · 679 阅读 · 0 评论 -
设计模式-简单工厂模式
前言在介绍简单工厂模式之前先介绍介绍创建模式。何谓创建模式?创建模式就是对类的实例化过程的抽象化。通俗的讲,一个系统在创建对象时,需要动态的决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象,创建模式描述了怎样构造和封装这些动态的决定。创建模式的分类创建模式分为类的创建模式和对象的创建模式。类的创建模式:类的创建模式使用继承关系,把类的创建延迟到子类,从而封原创 2016-10-28 16:22:43 · 516 阅读 · 0 评论 -
设计模式-工厂方法模式
引言为什么要引入工厂方法模式?前文已经详细的讲解了简单工厂模式,既然已经有了简单工厂模式,为什么还要有工厂方法模式呢?相信看完前文已经明确的知道简单工厂模式有以下不足:把实例的创建(在这里实际是指产品类的实例化)都放在了工厂类中,这样做的结果是非常危险的,一旦这个类出现任何问题,那么整个系统就game over了;不符合设计模式思想的“开-闭”原则。“开-闭”原则的核心就是原创 2016-11-02 17:46:19 · 477 阅读 · 0 评论 -
Spring源码阅读之DefaultListableBeanFactory系列-DefaultSingletonBeanRegistry
DefaultSingletonBeanRegistry是接口SingletonBeanRegistry的具体实现,实现了对单例的注册及获取等相关操作。相关源码分析:/** * 单例注册、获取等具体实现 */public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements Singleto原创 2016-11-01 16:03:11 · 1932 阅读 · 0 评论 -
Spring源码阅读之DefaultListableBeanFactory系列-SimpleAliasRegistry
SimpleAliasRegistry是AliasRegistry的具体实现,具体实现了对别名的增删改等操作。相关源码分析:/** * 实现对别名的增删改等操作 */public class SimpleAliasRegistry implements AliasRegistry { /** * 别名缓存,key是别名,value是name,在这里用Concurr原创 2016-11-01 12:58:50 · 1089 阅读 · 1 评论 -
Spring源码阅读之DefaultListableBeanFactory
注:本文所有的源码对应spring jar version为4.2.4类图开篇先给出DefaultListableBeanFactory类图,本篇将根据类图的继承关系从上往下依次分析。相关类介绍AliasRegistry:定义alias相关的简单的增删改查等操作;SimpleAliasRegistry:实现接口AliasRegistry,使用map做alias的缓存原创 2016-11-01 12:49:18 · 829 阅读 · 0 评论 -
Spring源码阅读之准备篇-Spring整体架构分析
前言Spring是2003年兴起的一个轻量级的Java开源框架,是为了解决企业应用开发的复杂性而创建的,它使用基本的javaBean来完成以前只可能由EJB完成的事情。但是,Spring的用途不仅仅限于服务器端的开发,从简单性、可测试性和松耦合的角度而言,任何的java应用都可以从Spring中受益。Spring的整体架构Spring框架是一个分层的架构,它包含一系列的功能要素,并被分原创 2016-10-31 14:49:06 · 1200 阅读 · 0 评论