
Java
文章平均质量分 77
Wangqyoho
多思考。
展开
-
基于多线程和本地缓存实现跨域重复调用的高性能
>> 最近工作了,写博客的时间越来越少了,思考的时间越来越少,学习沉淀的时间也越来越少。忙里偷闲,记录一些在平时工作中一些有亮点的小tip,记录一些实用的技能,也多亏平时接触到的有能力有想法的同事~前言对于大体量互联网公司的应用,更多场景下需要考虑性能问题,比如大促稳定性、高并发下HA等等。而且在目前微服务盛行的今天,糟糕的涉及往往会导致链路的高rt和糟糕的性能,进而导致糟糕的...原创 2018-11-01 11:38:02 · 779 阅读 · 0 评论 -
并发容器——ConcurrentHashMap
HashMap是非线程安全的,Hashtable是线程安全的,但是由于Hashtable是采用synchronized进行同步,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。 ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。Concurr原创 2017-02-09 16:14:00 · 350 阅读 · 0 评论 -
Java内存模型以及volatile关键字
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们转载 2016-10-16 14:20:13 · 577 阅读 · 0 评论 -
关于ThreadLocal的理解
当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方法就是不共享数据(虽然有点儿蠢...)。如果仅仅在单线程内访问数据,就不需要同步,这种技术就称作线程封闭(Thread Confinement)。 维持线程封闭性的一种较为规范的方法是使用ThreadLocal,这个类可以使得线程中的某个值与保存值的对象关联起来。ThreadLocal类提供了一系列的方法,这些方法为每个使用该变量原创 2016-10-18 15:27:42 · 453 阅读 · 0 评论 -
Java Collection集合框架关系详解
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。所以在答题的时候,注意是“继承”还是“实现”!原创 2016-09-11 20:55:03 · 1743 阅读 · 2 评论 -
HashSet底层实现
前几天了解了hashmap的底层实现,现在继续看一下hashset的底层实现。由于hashset底层是由hashmap实现的,所以放到后面来讲。有关hashmap的底层实现,可以戳这里: HashMap底层实现(jdk1.8)HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元原创 2016-10-30 15:12:40 · 1205 阅读 · 0 评论 -
HashMap底层实现(jdk1.8)
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。简单说下HashMap的实现原原创 2016-10-29 21:59:13 · 905 阅读 · 0 评论 -
Java并发编程:阻塞队列
在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程转载 2016-10-23 20:18:56 · 376 阅读 · 0 评论 -
Java Class文件的一些解读
最近问到了Class文件相关的问题,现在从网上搜索一些资料,并加上自己的补充,记录如下:Java Class文件中包含以下信息:ClassFile {u4 magic; //模数u2 minor_version;原创 2016-10-21 21:26:39 · 1726 阅读 · 0 评论 -
JVM 堆内存设置原理
看到一篇不错的文章,拿来记录分享一下。堆内存设置原理JVM堆内存分为2块:Permanent Space 和 Heap Space。Permanent 即 持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。Heap = { Old + NEW = {Eden, from, to} },Old 即转载 2016-09-08 13:54:50 · 490 阅读 · 0 评论 -
并发容器——CopyOnWrite
什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnW原创 2017-02-09 16:22:25 · 457 阅读 · 0 评论 -
线程通信中的CountDownLatch和CycliBarrier
一、CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,原创 2017-02-10 15:32:04 · 1655 阅读 · 0 评论 -
JAVA BIO和NIO及简单实现
最近简单研究了一下JAVA的NIO,话说出来这么久了,感觉这一块一直是空白,用的也比较少。但是感觉socket io这部分在以后工作中的高并发项目可能会用到,所以最近抽空研究了解了一下。1、阻塞IO阻塞IO比较简单,就是用普通的socket去写,因为没有什么太复杂的处理。建立一个socket,然后,获取它的inputstream和outputstream,然后进行读写操原创 2017-02-14 16:01:21 · 621 阅读 · 0 评论 -
不直接使用加减乘除完成四则运算?——二进制位运算实现四则运算
转载地址:https://ych0112xzz.github.io/2016/10/27/OperationwithBits/位运算实现整数加法方法x^y //执行加法,不考虑进位。(x&y)<<1 //进位操作解释在这里我们先用1位数的加法来进行,在不考虑进位的基础上,如下12341 + 1 = 01 + 0 = 10 + 1 = 10 + 0 = 0很明显这几个表达式可以...原创 2018-03-25 16:50:39 · 1566 阅读 · 0 评论 -
Java NIO (一)
在现在,Java NIO已经越来越多的获得了应用包括Tomcat,netty等,这项技术也由之前面试时候的加分项变成了Java程序员必备的技能之一。而之前我一直没有系统的对其进行学习梳理,因此现在闲下来,想对这一块的知识做一个相对完整的整理。话不多说,开始吧。引NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进原创 2017-09-15 10:26:28 · 548 阅读 · 0 评论 -
十大经典排序算法总结——Java实现
引这段时间博主逐步替换为Java的实现 //博主留 2017.9.15//2017.10.10完成冒泡排序的修改//2017.10.11完成选择排序、插入排序和希尔排序的修改//2017.10.14完成归并排序和快速排序修改//2017.10.16完成堆排序、计数排序、桶排序和基数排序的修改 All done!!原创 2016-09-19 12:12:01 · 11084 阅读 · 10 评论 -
Java泛型擦除和泛型的子类继承限制
一、引最近发现一个问题,LinkedList ls 不可以被赋值给LinkedList lo,这是为什么呢?这是因为Java中是泛型是伪泛型。虽然上面两个泛型的类具有继承关系,但是这两个List之间本身是没有关系的。当上述的LinkdedList被编译之后,class文件中其变成了LinkedList list,存在泛型擦除的过程。这样来看,上面两个LinkedList其实是可以包原创 2017-09-12 11:30:41 · 7249 阅读 · 0 评论 -
静态代理和动态代理的理解
Java 静态代理静态代理通常用于对原有业务逻辑的扩充。比如持有二方包的某个类,并调用了其中的某些方法。然后出于某种原因,比如记录日志、打印方法执行时间,但是又不好将这些逻辑写入二方包的方法里。所以可以创建一个代理类实现和二方方法相同的方法,通过让代理类持有真实对象,然后在原代码中调用代理类方法,来达到添加我们需要业务逻辑的目的。这其实也就是代理模式的一种实现,通过对真实对象的封装原创 2017-08-25 18:04:24 · 41752 阅读 · 18 评论 -
concurrent.locks包中的几种锁的区别
可重入锁(ReentrantLock)可分为好几种,分别对应了不同的用途,先贴上api:lockpublic void lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1。如果当前线程已经保持该锁,则将保持计数加 1,并且该方法立即返回。如果该锁被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁之前,该线程将一原创 2017-03-13 10:39:26 · 902 阅读 · 0 评论 -
数据结构编程题(不断更新)
记录一些数据结构的编程题好题:1、计算二叉树深度public class Solution { public int TreeDepth(TreeNode pRoot) { return pRoot == null ? 0 : Math.max(TreeDepth(pRoot.left), TreeDepth(pRoot.right)) + 1; }}递归原创 2016-09-27 10:26:53 · 6735 阅读 · 0 评论 -
字符操作编程题(不断更新)
一、给定一个字符串,找出最长的没有重复成员的字串,并返回长度第一个方法就是最老实的版本,逐步遍历所有子串,判断子串中有没有重复元素,记录全部遍历过程的最长子串长度。时间复杂度为O(n^3)。public class Solution { public int lengthOfLongestSubstring(String s) { int n = s.lengt原创 2016-11-01 15:10:06 · 936 阅读 · 0 评论 -
深入理解Java ClassLoader
转载地址:http://blog.youkuaiyun.com/xyang81/article/details/7292380一、什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都转载 2017-02-16 09:53:10 · 822 阅读 · 0 评论 -
JAVA类加载机制
类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示:其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Jav原创 2017-02-15 11:34:04 · 336 阅读 · 0 评论 -
Java内存结构模型和垃圾回收机制
这篇博客整合了好多位博主的知识分享,首先感谢各位前辈对这方面知识的总结归纳。在开始记录相关的知识前,先放上一张非常好的图,很好的描述了JVM的内存模型:一、JVM内存模型首先来看一下JVM内存模型总体架构图:程序计数器多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程有原创 2016-08-14 16:42:02 · 633 阅读 · 0 评论 -
Java线程相关的常用方法
join()——让一个线程等待另一个线程当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。join():等待被join的线程执行完成join(long millis)::等待被join的线程的时间最长为millis毫秒。如果在millis毫秒内被join的线程还没有执行结束,则不再等待。原创 2016-09-20 21:29:11 · 655 阅读 · 0 评论 -
Java内部类的作用
可以将一个类的定义放在另一个类的定义的内部,这就是内部类。内部类的作用:1、内部类可以很好的实现隐藏2、内部类拥有外围类的所有元素的访问权限3、可以实现多重继承4、可以避免接口中的方法和同一个类中的方法同名的问题关于以上几个作用,分别举几个例子说明一下:1、平时我们对类的访问权限,都是通过类前面的访问修饰符来限制的,一般的非内部类,是不允许有 private 与prot原创 2016-07-16 19:52:09 · 1288 阅读 · 0 评论 -
Java8中的Lambda表达式概述
最近函数式编程比较火,我也在面试中遇到了关于Java8的相关问题,所以查了查Java8的官方文档,在此放一篇对其中Lambda表达式简介的文章。并附上几个链接:http://www.techempower.com/blog/2013/03/26/everything-about-java-8/优质博客:http://www.cnblogs.com/figure9/archive/2转载 2016-07-03 16:56:00 · 652 阅读 · 0 评论 -
Java中的堆栈存储机制详解
转自:http://www.iteye.com/topic/6345301.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。)3. 堆:存放所有new出来的对象。4. 静态域:存放静态成员(转载 2016-06-14 22:50:49 · 1266 阅读 · 0 评论 -
synchronized分析
转载地址:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html第一篇:使用synchronized在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。我们首先编转载 2016-06-14 17:17:52 · 356 阅读 · 0 评论 -
Java中的基本数据类型
转载地址:http://blog.youkuaiyun.com/bingduanlbd/article/details/27790287Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定。由于是statical typed,导致Java语言也是强类型(Strong typed)的。强类型意味着每个变量都具有一种类型,每个表达式具有一种类型转载 2016-06-14 16:06:16 · 640 阅读 · 0 评论 -
Ubuntu下配置jdk8
1、下载JDK8安装包,小编是32位的操作系统,所以选择jdk-8u5-linux-i586.tar.gz下载地址是官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html这个当然是根据需要自己选择,我这里选择的是tar.gz版本的。转载 2016-06-05 22:27:05 · 480 阅读 · 0 评论 -
Java中的static关键字解析
Java中的static关键字解析本文转子博客园,单击此处阅读原文static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题。以下是本文的目录大纲:一.static关键字的转载 2016-06-24 09:41:53 · 352 阅读 · 0 评论 -
Java中的堆栈机制以及堆内存和栈内存
转载地址:http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放转载 2016-05-20 14:34:42 · 2032 阅读 · 1 评论 -
String的对象建立和Java的堆栈机制
首先理解几个概念:栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆:存放所有new出来的对象。在堆中分配的内存,由Java原创 2015-10-25 11:19:41 · 832 阅读 · 0 评论 -
HashSet中hashCode()的作用和覆写的理由
在存放集合这种数据的时候,我们可以选择List和Set两种形式,当然,Java当中它们不是具体的实现类.我们可以使用具体的实现类进行数据的存储. 但是List和Set的最显著区别,应该是,List可以放置相同的元素,Set只能放置不同的元素.也就是说Set里面的元素具有唯一性. 当然ArrayList和LinkedList也只是具体的实现形式不同了.我们也可以实现一个ArraySet或转载 2015-10-23 18:48:07 · 995 阅读 · 0 评论 -
Java?C++?虚函数?抽象?
之前面试的时候,被面试官问到有没有用到过Java 的虚函数。当时一脸蒙蔽...因为当时依稀记得虚函数是C++里的内容,Java中好像并没有关注虚函数这个概念,所以就说没用过......之后面试理所当然的没过。下来之后自己查了一下,发现Java中都是虚函数!!现在整理一下,同时对比着Java和C++来看一下虚函数。JavaC++普通函数虚函数原创 2016-07-17 15:50:40 · 594 阅读 · 0 评论 -
Java序列化与反序列化
一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是转载 2016-08-15 15:11:52 · 354 阅读 · 0 评论 -
深入理解Java:注解(Annotation)自定义注解入门
元注解: 元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解: 1.@Target, 2.@Retention, 3.@Documented, 4.@Inherited 这些类型和它们所支持的类在java.lang转载 2016-08-07 16:21:40 · 305 阅读 · 0 评论 -
Java并发与synchronized关键字
http://www.cnblogs.com/dolphin0520/ 该博主有很多关于并发的好文章。有空多读一读。 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。 以下是本文的目录大纲:转载 2016-09-18 15:58:46 · 994 阅读 · 0 评论 -
Everything about Java 8
原文地址:https://www.javacodegeeks.com/2014/05/java-8-features-tutorial.html翻译地址:http://www.jianshu.com/p/5b800057f2d81. 简介毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个翻译 2016-09-19 15:37:17 · 1012 阅读 · 0 评论