![](https://img-blog.csdnimg.cn/20191030222649612.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java
浅汐王
这个作者很懒,什么都没留下…
展开
-
Java工具类
随机生成时间范围内的时间戳 public static Date randomDate(String beginDate, String endDate) { try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date start = format.parse(beginDate);// 构造开始日期 Da原创 2020-07-13 11:43:42 · 70058 阅读 · 0 评论 -
IDEA-plugin之解决maven工程jar冲突必备良药Maven Helper
在开发的过程中,我们难免会遇到各种jar包冲突,如果不掌握解决的办法,就会连连报错!下面推荐一个IDEA的插件 -- Maven Helper安装有两种方式一种是IDEA自动安装,但是经过我IDEA 2017.03版本的测试,安装完没有任何作用。故不推荐。另外一种就是从Maven Helper插件官网下载,之后手动安装。下面开始正文安装下载离线插件包从Maven Helper...原创 2019-12-25 00:40:10 · 243 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之synchronizer框架:Phaser
一、Phaser简介Phaser是JDK1.7开始引入的一个同步工具类,适用于一些需要分阶段的任务的处理。它的功能与CyclicBarrier和CountDownLatch有些类似,类似于一个多阶段的栅栏,并且功能更强大,我们来比较下这三者的功能:同步器 作用 CountDownLatch 倒数计数器,初始时设定计数器值,线程可以在计数器上等待,当计数器值归0后,所有等待...原创 2019-12-14 21:39:33 · 320 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之synchronizer框架:Exchanger
一、Exchanger简介Exchanger——交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。Exchanger有点类似于CyclicBarrier,我们知道CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。Exchanger可以看成是一个双向栅栏,如下图:Thread1线程到达栅栏后...原创 2019-12-14 19:53:42 · 158 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之synchronizer框架:Semaphore
一、Semaphore简介Semaphore,又名信号量,这个类的作用有点类似于“许可证”。有时,我们因为一些原因需要控制同时访问共享资源的最大线程数量,比如出于系统性能的考虑需要限流,或者共享资源是稀缺资源,我们需要有一种办法能够协调各个线程,以保证合理的使用公共资源。Semaphore维护了一个许可集,其实就是一定数量的“许可证”。当有线程想要访问共享资源时,需要先获取(acquir...原创 2019-12-13 22:53:04 · 136 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之synchronizer框架:CyclicBarrier
一、CyclicBarrier简介CyclicBarrier是一个辅助同步器类,在JDK1.5时随着J.U.C一起引入。这个类的功能和我们之前介绍的CountDownLatch有些类似。我们知道,CountDownLatch是一个倒数计数器,在计数器不为0时,所有调用await的线程都会等待,当计数器降为0,线程才会继续执行,且计数器一旦变为0,就不能再重置了。CyclicBarrie...原创 2019-12-13 17:44:17 · 104 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之synchronizer框架:CountDownLatch
一、CountDownLatch简介CountDownLatch是一个辅助同步器类,用来作计数使用,它的作用有点类似于生活中的倒数计数器,先设定一个计数初始值,当计数降到0时,将会触发一些事件,如火箭的倒数计时。初始计数值在构造CountDownLatch对象时传入,每调用一次countDown()方法,计数值就会减1。线程可以调用CountDownLatch的await方法进入阻...原创 2019-12-13 16:27:25 · 109 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之atomic框架:LongAdder
一、LongAdder简介JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈————AtomicLong 具有更好的性能,代价是消耗更多的内存空间:那么,问题来了:为什么要引入LongAdder?AtomicLong在高并发的场景下有什...原创 2019-12-13 16:19:13 · 243 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之atomic框架:FieldUpdater
一、什么是FieldUpdater在java.util.concurrent.atomic包中,由三个比较特殊的原子类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。通过名称可以看到,这几类的功能大致相同,只是针对的类型有所不同。所谓AtomicXXXFieldUpdater,就是...原创 2019-12-13 15:32:40 · 216 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之atomic框架:Atomic数组
一、Atomic数组简介Atomic数组,顾名思义,就是能以原子的方式,操作数组中的元素。JDK提供了三种类型的原子数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。这三种类型大同小异,AtomicIntegerArray对应AtomicInteger,AtomicLongArray对应AtomicLong,Atomi...原创 2019-12-12 21:44:39 · 120 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之atomic框架:AtomicReference
一、AtomicReference简介AtomicReference,顾名思义,就是以原子方式更新对象引用。可以看到,AtomicReference持有一个对象的引用——value,并通过Unsafe类来操作该引用:为什么需要AtomicReference?难道多个线程同时对一个引用变量赋值也会出现并发问题?引用变量的赋值本身没有并发问题,也就是说对于引用变量var ,类似下面的赋...原创 2019-12-12 21:03:39 · 561 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之atomic框架:AtomicInteger
一、AtomicInteger简介AtomicInteger,应该是atomic框架中用得最多的原子类了。顾名思义,AtomicInteger是Integer类型的线程安全原子类,可以在应用程序中以原子的方式更新int值。1. 创建AtomicInteger对象先来看下AtomicInteger对象的创建。AtomicInteger提供了两个构造器,使用默认构造器时,内部int类型...原创 2019-12-12 17:28:16 · 149 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之atomic框架:Unsafe类
一、Unsafe简介在正式的开讲 juc-atomic框架系列之前,有必要先来了解下Java中的Unsafe类。Unsafe类,来源于sun.misc包。该类封装了许多类似指针操作,可以直接进行内存管理、操纵对象、阻塞/唤醒线程等操作。Java本身不直接支持指针的操作,所以这也是该类命名为Unsafe的原因之一。J.U.C中的许多CAS方法,内部其实都是Unsafe类在操作。比如At...原创 2019-12-12 17:09:18 · 113 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:StampedLock
一、StampedLock类简介StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控制并发。首先明确下,该类的设计初衷是作为一个内部工具类,用于辅助开发其它线程安全组件,用得好,该类可以提升系统性能,用不好,容易产生死锁和其它莫名其妙的问题。1....原创 2019-12-12 16:45:48 · 215 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:基于AQS的读写锁(5)
一、本文概述AQS系列的前四个章节,已经分析了AQS的原理,本文将会从ReentrantReadWriteLock出发,给出其内部利用AQS框架的实现原理。ReentrantReadWriteLock(以下简称RRW),也就是读写锁,是一个比较特殊的同步器,特殊之处在于其对同步状态State的定义与ReentrantLock、CountDownLatch都很不同。通过RRW的分析,我们可以...原创 2019-12-12 01:41:54 · 128 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:AQS共享功能剖析(4)
一、本文概述AQS系列的前三个章节,我们通过ReentrantLock的示例,分析了AQS的独占功能。本文将以CountDownLatch为例,分析AQS的共享功能。CountDownLatch,是J.U.C中的一个同步器类,可作为倒数计数器使用。CountDownLatch示例:假设现在有3个线程,ThreadA、ThreadB、mainThread,CountDownLatch初始...原创 2019-12-11 13:53:07 · 120 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:AQS的Conditon等待(3)
一、本文概述本文将继续以ReentrantLock的调用为例,说明AbstractQueuedSynchronizer提供的Conditon等待功能。关于Conditon接口的介绍,可以参见:Java多线程进阶—— J.U.C之locks框架:接口二、Condition接口的实现J.U.C包提供了Conditon接口,用以对原生的Object.wait()、Object.notify(...原创 2019-12-11 12:26:43 · 106 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:AQS独占功能剖析(2)
一、本文概述本文以 ReentrantLock 的调用为例,说明AbstractQueuedSynchronizer提供的独占功能。本文结构如下:以ReentrantLock的公平策略为例,分析AbstractQueuedSynchronizer的独占功能 以ReentrantLock的非公平策略为例,分析AbstractQueuedSynchronizer的独占功能 分析Abstr...原创 2019-12-10 21:02:20 · 109 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:AQS综述(1)
一、AQS简介AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,DougLea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。我们所熟知的Reentra...原创 2019-12-10 16:28:43 · 117 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:LockSupport
一、LockSupport类简介LockSupport类,是JUC包中的一个工具类,是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport类的核心方法其实就两个:park()和unark(),其中park()方法用来阻塞当前调用线程,unpark()方法用于唤醒指定线程。这其实和Object类的wait()和signial()方法有些类似,但是LockSupport的这两种方...原创 2019-12-10 15:45:38 · 91 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:ReentrantReadWriteLock
一、ReentrantReadWriteLock类简介ReentrantReadWriteLock类,顾名思义,是一种读写锁,它是 ReadWriteLock接口 的直接实现,该类在内部实现了具体独占锁特点的写锁,以及具有共享锁特点的读锁,和ReentrantLock一样,ReentrantReadWriteLock类也是通过定义内部类实现AQS框架的API来实现独占/共享的功能。Reen...原创 2019-12-09 16:44:23 · 195 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:ReentrantLock
一、ReentrantLock类简介ReentrantLock类,实现了Lock接口,是一种可重入的独占锁,它具有与使用synchronized相同的一些基本行为和语义,但功能更强大。ReentrantLock内部通过内部类实现了AQS框架(AbstractQueuedSynchronizer)的API来实现独占锁的功能。1.1 类声明ReentrantLock类直接实现了Lock...原创 2019-12-09 16:26:37 · 160 阅读 · 0 评论 -
Java多线程进阶—— J.U.C之locks框架:接口
本文中所说的juc-locks锁框架就是指java.util.concurrent.locks包,该包提供了一系列基础的锁工具,用以对synchronizd、wait、notify等进行补充、增强。juc-locks锁框架中一共就三个接口:Lock、Condition、ReadWriteLock,接下来对这些接口作介绍,更详细的信息可以参考Oracle官方的文档。一、Lock接口简介Lo...原创 2019-12-09 15:54:11 · 118 阅读 · 0 评论 -
JDK1.8 BlockingQueue详解
BlockingQueue简介BlockingQueue是在JDK1.5时,随着J.U.C引入的一个接口:public interface BlockingQueue<E> extends Queue<E> {}BlockingQueue继承了Queue接口,提供了一些阻塞方法,主要作用如下:当线程向队列中插入元素时,如果队列已满,则阻塞线程,直到队列有...原创 2019-12-09 14:21:29 · 340 阅读 · 0 评论 -
JDK1.8 ConcurrentHashMap详解
HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!原创 2019-12-09 14:05:38 · 584 阅读 · 0 评论 -
JDK1.8 ArrayList详解
1 ArrayList类定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { }从ArrayList的定义可以得出:ArrayLi...原创 2019-12-09 13:26:19 · 465 阅读 · 0 评论 -
JDK1.8 LinkedList详解
1 LinkedList类定义LinkedList 是一个继承于AbstractSequentialList的双向链表。其定义如下: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E...原创 2019-12-08 18:54:19 · 498 阅读 · 0 评论 -
JDK1.8 Hashtable详解
Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。1 Hashtable类定义 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { ...原创 2019-12-08 18:37:41 · 652 阅读 · 0 评论 -
JDK1.8 HashMap详解
HashMap是一个散列表,它存储的内容是键值对(key-value)映射。1 定义public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {}由HashMap定义可以看出1) HashMap&l...原创 2019-12-08 17:58:50 · 689 阅读 · 0 评论 -
常见面试题
i++在多线程环境下是否存在问题,怎么解决?虽然递增操作++i是一种紧凑的语法,使其看上去只是一个操作,但这个操作并非原子的,因而它并不会作为一个不可分割的操作来执行。实际上,它包含了三个独立的操作:读取count的值,将值加1,然后将计算结果写入count。这是一个“读取 - 修改 - 写入”的操作序列,并且其结果状态依赖于之前的状态。所以在多线程环境下存在问题。要解决自增操作在多线程环...原创 2019-12-08 15:32:28 · 97 阅读 · 0 评论 -
Java注解的使用
注解(Annotation)是 Java1.5 中引入的一个重大修改之一,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。注解在一定程度上是把元数据与源代码结合在一起,而不是保存在外部文档中。注解的含义可以理解为 java 中的元数据。元数据是描述数据的数据。注解是一个继承自java.lang.annotation.Annotation的接口理...原创 2019-12-08 13:06:06 · 269 阅读 · 0 评论 -
Java代理的使用
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达...原创 2019-12-07 20:48:52 · 111 阅读 · 0 评论 -
StringBuilder源码解析
StringBuilder被final关键字修饰,表明是不可变类,继承自抽象类AbstractStringBuilder。AbstractStringBuilder的底层结构AbstractStringBuilder底层封装了一个字符串数组: char[] value;与String不同,它不是使用final修饰的,可以修改。另外,与String不同,字符数组中不一定所有...原创 2019-12-07 15:41:42 · 327 阅读 · 0 评论 -
Java Object详解
ObjectgetClass返回该对象运行时的class对象,返回的Class对象是由所表示的类的静态同步方法锁定的对象。hashCode返回该对象的hashcode,该方法对hash表提供支持,例如HashMap。 对于该方法有几点需要注意: - 在运行中的Java应用,如果用在equals中进行比较的信息没有改变,那么不论何时调用都需要返回一致的int值。这个h...原创 2019-12-07 15:00:27 · 228 阅读 · 0 评论 -
Java泛型
Java泛型开发人员在使用泛型的时候,很容易根据自己的直觉而犯一些错误。比如一个方法如果接收List<Object>作为形式参数,那么如果尝试将一个List<String>的对象作为实际参数传进去,却发现无法通过编译。虽然从直觉上来说,Object是String的父类,这种类型转换应该是合理的。但是实际上这会产生隐含的类型转换问题,因此编译器直接就禁止这样的行为。类...原创 2019-12-07 14:54:02 · 85 阅读 · 0 评论 -
java 初级教程
javaweb学习笔记1.java web简介 1.1静态页面与动态页面 表现形式 所需技术 静态网页 网页内容固定,不会更新 html,css 动态网页 网页内容由程序动态显示,自动更新 html,css,DB,java/c#/php,javascript,xml,主流的动态网页脚本(jsp,asp.net,php) 1.2搭建java web开发环境 jdk1.转载 2016-09-22 11:44:26 · 1396 阅读 · 0 评论 -
Maven常用参数及其说明
Maven常用参数及其说明-h,--help Display help information-am,--also-make 构建指定模块,同时构建指定模块依赖的其他模块;-amd,--also-make-dependents 构建指定模块,同时构建依赖转载 2017-10-09 23:45:26 · 1280 阅读 · 0 评论 -
JDK 10的109项新特性
虽然感觉 JDK9 发布才仅仅几周的时间,然而,随着新的 OpenJDK 的发布节奏,JDK10 已经到达发布候选里程碑阶段。我看过各种关于 JDK10 新特性的博客,但是它们都倾向于关注通过 JEPS 定义的大方面。这篇博文,我将看看是否可以罗列出 JDK10 中已经发生变化的方方面面(包括新增的和剔除的)。有时候,我会做一些关于 Java SE 的报告会。之前我在“ JDK9 的 55 个新特...转载 2018-03-30 13:01:32 · 265 阅读 · 0 评论 -
Java多线程的同步
1.为什么要同步2.同步关键字synchronized3.死锁4.等待/唤醒机制5.锁对象---lock()接口6.condition接口---条件对象7.interrupt的使用8.守护线程(后台线程)9.join方法10.yield方法1.为什么要同步在计算机中,多线程的实现是通过CPU轮流执行各个线程,当一个线程任务被多个线程执行时,就有可能造成线...原创 2018-10-28 01:23:51 · 174 阅读 · 0 评论 -
Java中equals() 和 ==的区别
#注意,equals 和 == 的区别是基于引用指向对象的。常量的比较依然用 == 1.equals()用于比较两个引用指向的对象的值是否一样2. == 用于比较两个引用是否指向同一个对象如:public class Main{ public static void main(String args[]) { String str1 = new S...原创 2018-10-28 01:25:35 · 124 阅读 · 0 评论