
Java
文章平均质量分 88
lby0307
这个作者很懒,什么都没留下…
展开
-
HashTable和HashMap的区别详解
一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。 HashMap 实现了Seriali转载 2017-11-06 21:29:28 · 192 阅读 · 0 评论 -
jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
1.Jstack 1.1 jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示 注:这个和thread dump是同样的结果。但是thread dump是用kill -3 pid命令,还是服务器上面少用kill为妙 1.2 命名行格式 jstack [ option ] pid j转载 2018-02-07 09:43:25 · 287 阅读 · 0 评论 -
新生代Eden与两个Survivor区的解释
聊聊JVM的年轻代 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死转载 2018-02-07 10:44:54 · 200 阅读 · 0 评论 -
Java中的ThreadLocal对象
1.什么是ThreadLocal 根据JDK文档中的解释:ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性。 从这里可以看出,引入ThreadLocal的初衷是为了提供线程内的局部变量,而不是为了解决共享对象的多线程访问问题。实际上,ThreadLocal根本就不能解决共享对象的多线程访问问题。2.ThreadLocal实现...转载 2018-02-22 20:13:12 · 182 阅读 · 0 评论 -
AQS框架深入分析
一、什么是同步器多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx 。这个共同的语义可以称之为同步器。可以认为以上所有的锁机制都可以基于同步器定制来实现的。而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。juc 里所有的这些锁机制都是基于 AQS ( AbstractQueu...转载 2018-04-14 20:58:47 · 1772 阅读 · 0 评论 -
Java8新特性——StreamAPI
1. 收集器简介收集器用来将经过筛选、映射的流进行最后的整理,可以使得最后的结果以不同的形式展现。collect方法即为收集器,它接收Collector接口的实现作为具体收集器的收集方法。Collector接口提供了很多默认实现的方法,我们可以直接使用它们格式化流的结果;也可以自定义Collector接口的实现,从而定制自己的收集器。这里先介绍Collector常用默认静态方法的使用,自定义收集器...转载 2018-04-16 19:47:05 · 379 阅读 · 0 评论 -
SynchronousQueue
前言SynchronousQueue是一个比较特别的队列,由于在线程池方面有所应用,为了更好的理解线程池的实现原理,笔者花了些时间学习了一下该队列源码(JDK1.8),此队列源码中充斥着大量的CAS语句,理解起来是有些难度的,为了方便日后回顾,本篇文章会以简洁的图形化方式展示该队列底层的实现原理。SynchronousQueue简单使用经典的生产者-消费者模式,操作流程是这样的:有多个生产者,可以...转载 2018-04-26 22:09:24 · 329 阅读 · 1 评论 -
java8 对象转map时重复key Duplicate key xxxx
我们在利用java8 Lambda 表达式将集合中对象的属性转成Map时就会出现 Duplicate key xxxx , 说白了也就是key 重复了!案例如下: @Getter @Setter @AllArgsConstructor public class Student{ private String className; ...转载 2018-07-24 18:23:48 · 2633 阅读 · 0 评论 -
HashMap并发问题
之前在讲HashMap的时候提到过HashMap线程不安全,在并发环境下会发生死锁问题,将导致CPU占用率接近100%。其实死锁的说法并不很贴切,应该说是一种死循环。在JDK 1.8中,Map相关类的实现发生了很大变化,引入了红黑树的概念,本篇以JDK 1.7中的实现方式讲解HashMap的并发问题,以方便理解。 说明 JDK 1.8和JDK 1.7中,Map相关类的大体实现思想变化不大,知识...原创 2018-08-19 11:16:05 · 4727 阅读 · 0 评论 -
Java产生死锁的一个简单例子
思路是创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,这时就陷入了死锁。直接贴代码: public class DeadLock { public static String obj1 = "obj1"; public static ...原创 2018-08-19 18:02:47 · 162 阅读 · 0 评论 -
并发框架Disruptor场景应用
今天用一个停车场问题来加深对Disruptor的理解。一个有关汽车进入停车场的问题。当汽车进入停车场时,系统首先会记录汽车信息。同时也会发送消息到其他系统处理相关业务,最后发送短信通知车主收费开始。看了很多文章,里面的代码都是大同小异的,可能代码真的是很经典。以下代码也是来源网络,只是自己手动敲的,加了一些注释。 代码包含以下内容: 1) 事件对象Event 2)三个消费者Handler 3)一...原创 2018-11-21 11:40:46 · 426 阅读 · 0 评论 -
synchronized的实现原理
常见三种使用方法: 1)普通同步方法,锁是当前实例; 2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁; 3)对于同步代码块,锁是synchronized括号里配置的对象。 Java中的每个对象都可以作为锁。当一个线程访问同步代码块时,需要首先获取锁,退出代码块或抛出异常时必须释放锁 “锁”到底是个什么东东? ...原创 2018-11-24 17:39:18 · 167 阅读 · 0 评论 -
jstat命令查看jvm的GC情况 (以Linux为例)
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意!!!:使用的jdk版本是jdk8. 类加载统计: Loaded:加载class的数量Bytes:所占用空间大小Unloaded:未加载数量Bytes:未加载占用空间Time:时间转载 2018-02-07 09:31:53 · 3322 阅读 · 2 评论 -
annotation(@Retention@Target)详解
一、注解:深入理解JAVA注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。 1、元注解(meta-annotation): 元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说转载 2017-12-03 15:31:09 · 938 阅读 · 0 评论 -
Java并发编程:CopyOnWriteArrayList
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。 看如下代码: [java] view plain copy import java.util.ArrayList; import java.util.List; public cl转载 2017-11-06 21:39:07 · 156 阅读 · 0 评论 -
Java并发编程: ConcurrentHashMap的锁分段技术
ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。 HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是Co...转载 2017-11-06 21:55:29 · 276 阅读 · 0 评论 -
Java 类加载机制详解
一、类加载器 类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。 二、类的加载机制 在Java中,采用双亲委派机制来实现类的加载。那什么是双亲委转载 2017-11-03 09:08:27 · 128 阅读 · 0 评论 -
HashMap实现原理及源码分析
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。 目录 一、什么是哈希表转载 2017-10-26 21:22:48 · 163 阅读 · 0 评论 -
Lock和synchronized比较详解
一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: 1)获取锁转载 2017-11-04 09:55:30 · 158 阅读 · 0 评论 -
CountDownLatch
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编 程中跟CountDownLatch相关的以下几点: 目录 CountDownLatch是什么?CountDownLatch如何转载 2017-10-25 21:39:32 · 124 阅读 · 0 评论 -
volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们转载 2017-11-04 11:00:59 · 3644 阅读 · 0 评论 -
PriorityBlockingQueue
PriorityBlockingQueue类是JDK提供的优先级队列 本身是线程安全的 内部使用显示锁 保证线程安全 PriorityBlockingQueue存储的对象必须是实现Comparable接口的 因为PriorityBlockingQueue队列会根据内部存储的每一个元素的compareTo方法比较每个元素的大小 这样在take出来的时候会根据优先级 将优先级最小的最先转载 2017-11-04 11:43:07 · 144 阅读 · 0 评论 -
Java并发之Semaphore详解
Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 Sem转载 2017-11-05 20:41:37 · 179 阅读 · 0 评论 -
Java并发之Exchanger详解
ava 并发 API 提供了一种允许2个并发任务间相互交换数据的同步应用。更具体的说,Exchanger类允许在2个线程间定义同步点,当2个线程到达这个点,他们相互交换数据类型,使用第一个线程的数据类型变成第二个的,然后第二个线程的数据类型变成第一个的。 示例1 一个人有零食,另一个人有钱,他们两个想等价交换,对好口号在某个地方相见,一个人先到了之后,必须等另一个人带着需要的东西来了之后,转载 2017-11-05 21:05:17 · 379 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 若有不正之处请多多谅解,并欢迎转载 2017-11-05 21:17:13 · 135 阅读 · 0 评论 -
Java并发之Future类和Callable类详解
有时候在实际应用中,某些操作很耗时,但又不是不可或缺的步骤。比如用网页浏览器浏览新闻时,最重要的是显示文字内容,至于与新闻相匹配的图片就没有那么重要的,所以此时首先保证文字信息先显示,而图片信息会后显示,但又不能不显示,由于下载图片是一个耗时的操作,所以必须一开始就得下载。 Java的并发库的Future类就可以满足这个要求。Future的重要方法包括get()和cancel(),ge转载 2017-11-05 22:07:10 · 440 阅读 · 0 评论 -
内存屏障
内存屏障(Memory barrier) 为什么会有内存屏障 每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性能,避免每次都要向内存取。但是这样的弊端也很明显:不能实时的和内存发生信息交换,分在不同CPU执行的不同线程对同一个变量的缓存值不同。 用volatile关键字修饰变量可以解决上述问题,那么volatile是如何做到这一点的呢?那就是内存屏障,内存屏障...原创 2018-11-24 17:43:56 · 174 阅读 · 0 评论