自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

木村的博客

bug跟蚊子的相似之处: 1、不知道藏在哪里。 2、不知道有多少。 3、总是在你即将睡觉休息的时候出现。

  • 博客(199)
  • 收藏
  • 关注

转载 Java【并发】面试题

Java【并发】面试题Java 线程简述线程、进程、程序的基本概念?程序程序,是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

2019-06-19 14:32:34 2446

转载 Java并发编程:线程池的使用

Java并发编程:线程池的使用一.Java中的ThreadPoolExecutor类java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。在ThreadPoolExecutor类中提供了四个构造方法:public...

2019-06-19 14:07:59 142

转载 CountDownLatch

CountDownLatch原理1. 简介在上篇博客中,我们介绍了 Java 四大并发工具之一的 CyclicBarrier ,今天要介绍的CountDownLatch 与 CyclicBarrier 有点儿相似。用给定的计数初始化 CountDownLatch。由于调用了 #countDown() 方法,所以在当前计数到达零之前,#await() 方法会一直受阻塞。之后,会释放所有等待的...

2019-05-29 10:53:42 2347

转载 CyclicBarrier

CyclicBarrier原理1. 简介CyclicBarrier ,一个同步辅助类,在 AP I中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (Common Barrier Point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 Barrier 在释放等待线程后可以重用,所以称它为循环( Cyclic ...

2019-05-29 10:53:22 316

转载 信号量 Semaphore

信号量 Semaphore1. 简介信号量 Semaphore 是一个控制访问多个共享资源的计数器,和 CountDownLatch 一样,其本质上是一个“共享锁”。一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire,然后再获取该许可。每个 release 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对...

2019-05-29 10:31:20 1464

转载 深入分析 CAS

深入分析 CAS1. 概述CAS ,Compare And Swap ,即比较并交换。Doug Lea 大神在实现同步组件时,大量使用CAS 技术,鬼斧神工地实现了Java 多线程的并发操作。整个 AQS 同步组件、Atomic 原子类操作等等都是基 CAS 实现的,甚至 ConcurrentHashMap 在 JDK 1.8 的版本中,也调整为 CAS + synchronized 。可以说...

2019-05-29 10:30:51 199

转载 LinkedBlockingQueue 和 ConcurrentLinkedQueue的用法及区别

LinkedBlockingQueue 和 ConcurrentLinkedQueue的用法及区别在 Java 多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的 Queue 可以分为阻塞队列,典型例子是 LinkedBlockingQueue适用阻塞队列的好处:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即...

2019-05-28 16:00:56 708

转载 从一个故障说说Java的三个BlockingQueue

从一个故障说说Java的三个BlockingQueue最近出了个故障,排查的时候耗费了很长的时间,回顾整个排查过程,经验主义在这里起了不好的作用,直接导致了整个故障排查的时间非常长,这个故障的根本原因在于BlockingQueue用的有问题,顺带展开说说Java中常用的几个BlockingQueue:ArrayBlockingQueue、LinkedBlockingQueue和Synchrono...

2019-05-28 16:00:34 189

转载 ArrayBlockingQueue与LinkedBlockingQueue

ArrayBlockingQueue与LinkedBlockingQueue序本文主要简单介绍下ArrayBlockingQueue与LinkedBlockingQueue。对比queue阻塞与否是否有界线程安全保障适用场景注意事项ArrayBlockingQueue阻塞有界一把全局锁生产消费模型,平衡两边处理速度用于存储队列元素的存储空间是预先分配的...

2019-05-28 16:00:08 200

转载 阻塞队列(七):BlockingQueue 总结

阻塞队列(七):BlockingQueue 总结经过前面六篇博客的阐述,我想各位应该对阻塞队列BlockingQueue有了较为深入的理解,下面来一个总结,先看整个类图:BlockingQueueBlockingQueue接口实现Queue接口,它支持两个附加操作:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。相对于同一操作他提供了四种机制:抛出异常、返回特殊值、阻塞等待、超...

2019-05-28 14:12:28 327

转载 阻塞队列(六):LinkedBlockingDeque

阻塞队列(六):LinkedBlockingDeque前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和移除元素,同样意味着LinkedBlockingDeque支持FIFO、FILO两种操作方式。LinkedBlockingDeque是可选容量的,在初始化时可以设置容量防...

2019-05-28 14:12:06 827

转载 阻塞队列(五):LinkedTransferQueue

阻塞队列(五):LinkedTransferQueue前面提到的各种BlockingQueue对读或者写都是锁上整个队列,在并发量大的时候,各种锁是比较耗资源和耗时间的,而前面的SynchronousQueue虽然不会锁住整个队列,但它是一个没有容量的“队列”,那么有没有这样一种队列,它即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会锁住整个队列...

2019-05-28 14:11:35 367

转载 阻塞队列(四):SynchronousQueue

阻塞队列(四):SynchronousQueue作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之...

2019-05-28 14:11:12 264

转载 阻塞队列(三):DelayQueue

阻塞队列(三):DelayQueueDelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面:缓存:清掉缓存中超时的缓存数据任务超时处理DelayQueueDela...

2019-05-28 14:10:49 162

转载 阻塞队列(二):PriorityBlockingQueue

阻塞队列(二):PriorityBlockingQueue我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? PriorityBl...

2019-05-28 14:10:12 628

转载 阻塞队列(一):ArrayBlockingQueue

阻塞队列(一):ArrayBlockingQueue1. 简介ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用 FIFO 的原则对元素进行排序添加的。ArrayBlockingQueue 为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue 支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默...

2019-05-28 14:09:28 580

转载 ConcurrentHashMap 红黑树转换分析

ConcurrentHashMap 红黑树转换分析先看红黑树的基本概念:红黑树是一课特殊的平衡二叉树,主要用它存储有序的数据,提供高效的数据检索,时间复杂度为O(lgn)。红黑树每个节点都有一个标识位表示颜色,红色或黑色,具备五种特性:每个节点非红即黑根节点为黑色每个叶子节点为黑色。叶子节点为NIL节点,即空节点如果一个节点为红色,那么它的子节点一定是黑色从一个节点到该节点的子孙节点...

2019-05-13 15:34:21 3107 2

转载 Java并发容器:ConcurrentHashMap

Java并发容器:ConcurrentHashMapHashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,...

2019-05-13 15:32:45 167

转载 Java 内存模型之 happens-before

Java 内存模型之 happens-before由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程 A 修改了变量 a ,何时对线程 B 可见?在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在 happens-before 关系。happens-before 原则非常重要,它...

2019-05-09 10:10:33 118

转载 重入锁:ReentrantLock

重入锁:ReentrantLock1. 简介ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于 synchronized 的使用,但是 ReentrantLock 提供了比 synchronized 更强大、灵活的锁机制,可以减少死锁发生的概率。一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本...

2019-05-09 10:10:10 151

转载 Java中long和double的原子性

Java中long和double的原子性JVM中对long的操作是不是原子操作?首先,通过一段程序对long的原子性进行判断。测试程序如下:public class LongAtomTest implements Runnable { private static long field = 0; private volatile long value; publ...

2019-05-08 18:01:01 957

转载 深入分析 volatile 的实现原理

深入分析 volatile 的实现原理通过前面一章,我们了解了 synchronized 是一个重量级的锁,虽然 JVM 对它做了很多优化。而下面介绍的 volatile ,则是轻量级的 synchronized ,它在多线程开发中保证了共享变量的“可见性”。如果一个变量使用 volatile ,则它比使用 synchronized 的成本更加低,因为它不会引起线程上下文的切换和调度。Jav...

2019-05-08 18:00:37 153

转载 Java锁的种类以及辨析(四):可重入锁

Java锁的种类以及辨析(四):可重入锁本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁下面是使用实例public class Test implements...

2019-05-08 17:23:30 229

转载 Java锁的种类以及辨析(三):阻塞锁

Java锁的种类以及辨析(三):阻塞锁阻塞锁,与自旋锁不同,改变了线程的运行状态。在JAVA环境中,线程Thread有如下几个状态:1,新建状态2,就绪状态3,运行状态4,阻塞状态5,死亡状态阻塞锁,可以说是让线程进入阻塞状态进行等待,当获得相应的信号(唤醒,时间) 时,才可以进入线程的准备就绪状态,准备就绪状态的所有线程,通过竞争,进入运行状态。JAVA中,能够进入\退出、阻...

2019-05-08 17:23:14 551

转载 Java锁的种类以及辨析(二):自旋锁的其他种类

Java锁的种类以及辨析(二):自旋锁的其他种类上篇我们讲到了自旋锁,在自旋锁中 另有三种常见的锁形式:TicketLock ,CLHlock 和MCSlockTicket锁主要解决的是访问顺序的问题,主要的问题是在多核cpu上package com.alipay.titan.dcc.dal.entity;import java.util.concurrent.atomic.Atomi...

2019-05-08 17:22:48 297

转载 java锁的种类以及辨析(一):自旋锁

java锁的种类以及辨析(一):自旋锁1、自旋锁自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下public class SpinLock { private AtomicReference<Thread> sign =new AtomicReference<>(); public void lock(...

2019-05-08 17:22:26 201

转载 深入理解并发之CompareAndSet(CAS)

深入理解并发之CompareAndSet(CAS)一、CAS简介CAS:Compare and Swap, 翻译成比较并交换。java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁,使用这些类在多核CPU的机器上会有比较好的性能.CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改...

2019-05-08 13:48:13 652

转载 深入分析 synchronized 的实现原理

深入分析 synchronized 的实现原理记得刚刚开始学习 Java 的时候,一遇到多线程情况就是 synchronized ,相对于当时的我们来说 synchronized 是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道 synchronized 是一个重量级锁,相对于 Lock ,它会显得那么笨重,...

2019-05-08 10:45:10 2766 2

转载 ThreadLocal 解决SimpleDateFormat非线程安全

ThreadLocal 解决SimpleDateFormat非线程安全大致意思:Tim Cull碰到一个SimpleDateFormat带来的严重的性能问题,该问题主要有SimpleDateFormat引发,创建一个 SimpleDateFormat实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。即使将 SimpleDateFormat定义为静态类变量,貌似能解决这个...

2019-05-06 17:04:27 679

转载 Java并发编程:深入剖析ThreadLocal

Java并发编程:深入剖析ThreadLocal想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。以下是本文目录大纲:一.对ThreadLocal的理解二.深入解析ThreadLo...

2019-05-06 17:03:54 181

转载 Sleep(0)的妙用

Sleep(0)的妙用Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让其他线程有机会优先执行。Thread.Sleep(0) 是你的线程暂时放弃cpu,也就是释放一些未用的时间片给其他线程或进程使用,就相当于一个让位动作。Thread th = new Thread(new ThreadStart(Mai...

2019-04-28 11:28:11 225

转载 Java多线程——线程间协作方式总结及使用示例

Java多线程——线程间协作方式总结及使用示例线程之间的协作方式方式一、wait()、notify()、notifyAll()wait()提供了一种在任务之间对活动同步的方式。wait()使你可以等待某个条件发生变化,通常,这种条件将由另一个任务来改变。wait()会在等待外部世界发生变化的时候将任务挂起(而不是执行空循环,进行忙等待),并且只有在notify()或notifyAll()发...

2019-04-26 14:17:36 577

转载 Notify通知机制解析

Wait/Notify通知机制解析前言我们知道,java的wait/notify的通知机制可以用来实现线程间通信。wait表示线程的等待,调用该方法会导致线程阻塞,直至另一线程调用notify或notifyAll方法才可另其继续执行。经典的生产者、消费者模式即是使用wait/notify机制得以完成。在这篇文章中,我们将深入解析这一机制,了解其背后的原理。线程的状态在了解wait/noti...

2019-04-26 14:06:00 1092

转载 JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止

JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止当单线程的程序发生一个未捕获的异常时我们可以采用try…catch进行异常的捕获,但是在多线程环境中,线程抛出的异常是不能用try…catch捕获的,这样就有可能导致一些问题的出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。首先来看一个示例:package com.exceptio...

2019-04-26 10:48:47 675

转载 Java【虚拟机】面试题

Java【虚拟机】面试题什么是虚拟机?Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件( .class )。Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。但是,跨平台的是 Java ...

2019-04-23 20:48:54 2642

原创 Tomcat 类加载器之为何违背双亲委派模型

Tomcat 类加载器之为何违背双亲委派模型如何破坏双亲委任模型?双亲委任模型不是一个强制性的约束模型,而是一个建议型的类加载器实现方式。在Java的世界中大部分的类加载器都遵循者模型,但也有例外,到目前为止,双亲委派模型有过3次大规模的“被破坏”的情况。 第一次:在双亲委派模型出现之前—–即JDK1.2发布之前。 第二次:是这个模型自身的缺陷导致的。我们说,双亲委派模...

2019-04-23 20:46:24 603 1

原创 线程上下文类加载器

线程上下文类加载器此前我对线程上下文类加载器(ThreadContextClassLoader,下文使用TCCL表示)的理解仅仅局限于下面这段话:Java 提供了很多服务提供者接口(Service Provider Interface,SPI),允许第三方为这些接口提供实现。常见的 SPI 有 JDBC、JCE、JNDI、JAXP 和 JBI 等。这些 SPI 的接口由 Java 核心库来提...

2019-04-23 20:45:50 147

原创 FullGC频繁的排查

FullGC频繁的排查Full GC的原因我们知道Full GC的触发条件大致情况有以下几种情况:程序执行了System.gc() //建议jvm执行fullgc,并不一定会执行执行了jmap -histo:live pid命令 //这个会立即触发fullgc在执行minor gc的时候进行的一系列检查执行Minor GC的时候,JVM会检查老年代中最大连续可用空间是否大于了当前新...

2019-04-19 17:33:51 497

转载 深入理解7种垃圾收集器

深入理解7种垃圾收集器**如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。**Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。接下来讨论的收集器基于JDK1.7 Update 14 之后的HotSpot虚拟机(在此版...

2019-03-22 16:26:31 1698 1

转载 Java 中的四种引用类型

Java 中的四种引用类型一、背景Java的内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收。Java以便我们控制对象的生存周期,提供给了我们四种引用方式,引用强度从强到弱分别为:强引用、软引用、弱引用、虚引用。二、简介1. 强引用 StrongReferenceStrongReference是Java的默认引用形式,使用时不需要显示定义。任何通过强引用所使用的对...

2019-03-21 17:37:52 988

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除