[TOC]线程池模型架构自定义线程池包括:Thread Pool(线程池)+ Blocking Queue(阻塞队列)图例分析图中内容表示,三个消费线程或者说是核心线程 t1、t2、t3 通过poll方法从阻塞队列中执行任务,main线程不断地往阻塞队列中put任务task,如果核心线程处于忙碌状态,task就放进阻塞队列中。实现步骤步骤1:自定义拒绝策略接口@FunctionalInter...
[TOC]前言final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦将引用声明作final,将不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。一、final基本使用在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。1.1 修饰类当用final修饰一个类时,表明这个类不能被继承。最常见是就...
[TOC]前言小编之前转载过一篇文章《设计模式之享元模式》在开始本节之前,如果之前没有接触过这个概念的,建议可以先看一下,对享元模式有一个基本的认识。一、简介1.1 定义享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此...
[TOC]一、日期转换的问题1.1 问题提出下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的import lombok.extern.slf4j.Slf4j; import java.text.ParseException; import java.text.SimpleDateFormat; /** * @author lilinchao * @date ...
[TOC]前一段时间在研究juc源码的时候,发现在很多工具类中都调用了一个Unsafe类中的方法,出于好奇就想要研究一下这个类到底有什么作用,于是先查阅了一些资料,一查不要紧,很多资料中对 Unsafe 的态度都是这样的画风:其实看到这些说法也没什么意外,毕竟 Unsafe 这个词直译过来就是“不安全的”,从名字里我们也大概能看来 Java 的开发者们对它有些不放心。但是作为一名极客,不能你...
[TOC]一、原子累加器对比我们通过如下代码,比较synchronized、AtomicInteger、AtomicLong、LongAdder、LongAccumulator五种计数性能。示例需求:热点商品点赞计算器,点赞数进行统计,不要求实时精确。50个线程,每个线程100W次,统计总点赞数。import java.util.concurrent.CountDownLatch; impo...
[TOC]一、概述前面所讲的几个原子更新引用类型如:AtomicReference,用于整个对象的更新。但不是每次都必须更新整个对象,有可能我们只需对对象中的某个字段进行原子性修改时,那么就需要使用原子更新字段类。在java.util.concurrent.atomic中,原子类型字段更新器有以下三种:AtomicIntegerFieldUpdater:基于反射的工具类,可以原子性的更新指定...
[TOC]一、数组类型的原子类原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。CAS是按照==来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的类型有关系了。在java.util.concurrent.atomic中,原子类型数组有以下四种:类名说明AtomicIntegerArray提供对int[]数组元素...
[TOC]一、概述为什么需要原子引用类型?保证引用类型的共享变量是线程安全的。基本类型原子类只能更新一个变量,如果需要原子更新多个变量,需要使用引用类型原子类。AtomicReference:引用类型原子类;AtomicStampedRerence:原子更新带有版本号的引用类型;该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的...