- 博客(102)
- 资源 (11)
- 收藏
- 关注
转载 详解布隆过滤器的原理、使用场景和注意事项
什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现原理HashMap 的问题讲述布隆过滤器的...
2019-02-28 22:00:58 106
原创 redis用布隆过滤器解决缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器(见博客《详解布隆过滤器的原理、使用场景和注意事项》),将所有可能存在的数据哈希到一个足够大的...
2019-02-28 21:49:39 3393
转载 Java中final、finally、finalize的区别与用法
1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。2.中等区别:虽然这个单词在Java中都存在,但是并没太多关联:final:java中的关键字,修饰符...
2019-02-28 21:22:58 346
转载 Java线程池工作原理
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池,所以我们就要认识并弄懂线程池,以便于更好的为我们业务场景服务。一、线程池的好处在开发过程中,合理地使用线程池大致有3个好处第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:...
2019-02-28 21:06:34 2178
转载 volatile能保证有序性
在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。 volatile关键字禁止指令重排序有两层意思: 1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行; 2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,...
2019-02-28 16:28:20 6435 5
转载 深入剖析volatile关键字
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 先看一段代码,假如线程1先执行,线程2后执行://线程1boolean stop = f...
2019-02-28 16:07:33 110
转载 Java内存模型(原子性、可见性、有序性)
Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。 举个简单的例子:在java中,执行下面这个语句:i = 10;执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当...
2019-02-28 15:12:17 840 1
转载 并发编程中的三个概念(原子性,可见性,有序性)
在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:1.原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。 试想一下...
2019-02-28 14:58:49 365
转载 内存模型的相关概念Intel 的MESI协议保证线程安全
大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存...
2019-02-28 14:24:40 415 1
转载 Spring中Bean初始化实例【重要】
Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关键点。 若容器注册了以上各种接口,程序那么将会按照以上的流程进行。下面将仔细讲解各接口作用。1:BeanFactoryPostProcessorSpring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取...
2019-02-27 22:52:25 1208
原创 Java规则之条件语句中||常犯的错误
在Java中,逻辑运算符||(短路或)具体运算规则如下:||的运算规则:i.当符号左边表达式为true时,||将直接返回true不在判断符号右边的表达式结果。ii.当符号左边表达式为false时,将继续判断符号右边表达式,||的结果与右边表达式结果一致。根据&&和||的运算规则,下面我们来对以上错误实例进行分析。...
2019-02-27 00:13:42 258
转载 为什么HashMap线程不安全
一、Map概述我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图上面展示了java中Map的继承图,Map是一个接口,我们常用的实现类有HashMap、LinkedHashMap、TreeMap,HashTable。HashMap根据key的hashCode值来保存value,需...
2019-02-26 20:25:01 1842
转载 LinkedBlockingQueue
1、简介这一篇我们来学习一下ArrayBlockingQueue的“亲戚” LinkedBlockingQueue。在集合框架里,想必大家都用过ArrayList和LinkedList,也经常在面试中问到他们之间的区别。ArrayList和ArrayBlockingQueue一样,内部基于数组来存放元素,而LinkedBlockingQueue则和LinkedList一样,内部基于链表来存放元...
2019-02-26 14:45:41 98
翻译 Java多线程的上下文切换
对于上下文切换不同的操作系统模式也不尽相同,这里我们只讨论Unix系统,在我之前的文章中提到过windows的抢占式,这里就不在赘述。 无论是单核还是多核CPU都是支持多线程代码的,CPU通过给每个线程分配CPU时间片来实这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms) CPU通过时间...
2019-02-26 01:08:41 789
转载 JAVA自带的4种线程池
为什么要用线程池:1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的...
2019-02-25 23:28:43 3602 1
转载 ThreadPoolExecutor线程池参数设置技巧
JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同时,对于该线程池不恰当的设置也可能使其效率并不能达到预期的效果,甚至仅相当于或低于单线程的效率。ThreadPoolExecutor类可设置的参数主要有:corePoolSize在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待...
2019-02-25 21:52:27 753
转载 使用有界队列的线程池使用DiscardOldestPolicy拒绝策略
public class MyTask implements Runnable { private int taskId; private String taskName; public MyTask(int taskId, String taskName){ this.taskId = taskId; this.taskName = ...
2019-02-25 21:34:34 311
转载 Spring事务传播行为详解
前言Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。但是人们对他的误解也颇多,你一定也听过“service方法事务最好不要嵌套”的传言。要想正确的使用工具首先需要了解工具。本文...
2019-02-24 18:31:28 105
转载 mysql意向锁
详解 MySql InnoDB 中意向锁的作用前言InnoDB 支持多粒度锁(multiple granularity locking),它允许行级锁与表级锁共存,而意向锁就是其中的一种表锁。意向锁(Intention Locks)需要强调一下,意向锁是一种不与行级锁冲突表级锁,这一点非常重要。意向锁分为两种:意向共享锁(intention shared lock, IS):事...
2019-02-24 17:50:58 420
转载 希尔排序
(1)希尔排序(shell sort)这个排序方法又称为缩小增量排序,是1959年D·L·Shell提出来的。该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工...
2019-02-24 15:44:34 288
转载 Java垃圾回收(整理)
什么样的对象才是垃圾?怎样判断一个对象引用是不是垃圾? 垃圾回收算法:Mark-Sweep(标记-清除)算法,Copying(复制)算法,Mark-Compact(标记-整理)算法,分代收集算法Generational Collection,分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(...
2019-02-24 15:05:30 111
转载 Java对象内存分配策略
1. 对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。代码示例:private static final int _1MB = 1024 * 1024; /** * VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -...
2019-02-24 14:55:53 815
转载 parallel scavenge 与parnew 区别:
Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器……看上去和ParNew都一样,那它有什么特别之处呢?Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Through...
2019-02-24 13:33:29 13843 4
原创 插入排序
import java.util.concurrent.TransferQueue;public class InsertSort { public static void main(String[] args) { int a[] = {3,1,5,7,2,4,9,6,7}; insertSort(a); for(i...
2019-02-24 00:47:50 94
原创 Java选择排序
简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与arr[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。举例:数组 int[] arr=...
2019-02-23 21:33:16 83
转载 白话经典算法系列之六 快速排序 快速搞定
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,...
2019-02-23 14:41:15 123
转载 冒泡排序的时间复杂度
冒泡排序是一种用时间换空间的排序方法,最坏情况是把顺序的排列变成逆序,或者把逆序的数列变成顺序。在这种情况下,每一次比较都需要进行交换运算。举个例子来说,一个数列 5 4 3 2 1 进行冒泡升序排列,第一次大循环从第一个数(5)开始到倒数第二个数(2)结束,比较过程:先比较5和4,4比5小,交换位置变成4 5 3 2 1;比较5和3,3比5小,交换位置变成4 3 5 2 1……最后比较5和1,1...
2019-02-23 14:12:10 997
原创 二分查找的错误写法
public class W { public static void main(String[] args) { int[] a = {1,2,3,4,5,6,7,8,9}; int b = midSearch(a,0,a.length-1,7); System.out.println(a[b]); } public ...
2019-02-23 12:49:10 322
原创 java 快速排序
快速排序算法思想:1:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法)2:然后分别从数组的两端扫描数组,设两个指示标志(lo指向起始位置,hi指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换lo和hi位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换lo和hi位置的值,如此往...
2019-02-23 00:03:34 437
原创 Java中如何判断一个集合中的一个元素不在另一个集合中?把不存在的元素移除
判断一个元素在集合中很容易,只需要遍历这个集合,然后与每个值进行比较,如果有相等的,那么就存在在集合中,然后反过来,就是不存在集合中的,找到它好像挺容易,但是写起代码来好像有点绕,那么,现在就把它写出来: package org.luzhen.test;import java.util.ArrayList;import java.util.List;/** * @Author: ...
2019-02-22 15:53:33 2954
原创 java 链表实现栈
思想是: 入栈的顺序是:1 2 3 4 5 那么保证出栈的顺序是5 4 3 2 1,以此类推 让head节点 指向栈顶节点 保证让其 倒序输出public class MyStack<T> { private T data; private MyStack<T> next; public MyStack(T data, My...
2019-02-21 23:56:00 1425
转载 二进制为何用八位来表示?
八位(8bit)是一个字节,计算机中只要一个字节就可以存放ASCII编码,就是所有的数字、大小写字母和一些特殊字符(总共255个)。所以在计算机中对用户来说有意义的单位就是字节,这是我们可以看懂的。八位的二进制数最大值就是255,刚好表示255个ASCII字符。我们汉字使用的是unicode编码的,unicode编码要用两个字节,所以要存放16位二进制数才能代表一个unicode字符。另外还...
2019-02-21 16:49:02 7728 3
转载 二进制怎么相加减
1.二进制加法运算法则:0+0=0,0+1=1,1+0=1,1+1=10 ,也就是当两个相加的二进制位仅一位为1时,相加的结果为1;如果两个二进制位全是0,相加的结果仍为0;而如果两个相加的二进制位均为1,则结果为10(相当于十进制中的2),也就是“逢2进1”规则,与十进制中的“逢10进1”的道理一样。二进制的相加与十进制的相加其实很多地方是类似的。具体方法请看我下面的图解。一步一步教你学会...
2019-02-21 14:11:42 27931
转载 计算机中二进制的移位运算
移位运算符:高位左移后溢出,舍弃:如: <<:左移 左移是将一个二进制操作数对象按指定的移动位数向左移,左边溢出的位数被丢弃,右边的空位用0补充。左移相当于乘以2的幂次。∫将一个运算对象的各二进制位,全部左移若干位(左边的二进制丢弃,右边补0) 例如:左移1位>>:有符号右移 右移是将一个二进制操作数对象按指定...
2019-02-21 14:04:19 17775 1
原创 ZAB
ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议。 ZAB 协议定义:ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复...
2019-02-21 01:16:27 2451 1
转载 mysql存储IP地址省空间的方法
作为一名开发人员,当你在使用mysql来做为你的存储数据库,肯定都会考虑用最合适的字段类型来创建数据库表吧。 www.2cto.com 可是假如你其中一个语句这么写 ip varchar(15) not null default '' COMMENT '用户IP地址',你有没考虑过,其实,有更省空间的方式来存储用户的IP地址。(这个虽然是变长的,但对于大部分中国IP来说,基本都在10字...
2019-02-20 13:53:47 195
转载 二进制与十进制的转换教案
【教学目的与要求】1、熟悉数制的概念;2、掌握位权表示法; 3、熟练掌握二进制与十进制之间的转换方法。【课时安排】 1课时。【教学重点与难点】1、难点:位权表示法 十进制转化为二进制 2、重点:二、十进制间相互转换【教学过程】 (以下教师的语言、活动简称“师”,学生的活动简称“生”)新课导入师:猜一猜:简单的数字:10,这是几? 我认为这是2...
2019-02-19 22:47:10 18927 1
原创 二分查找递归方式
二分查找算法思想:又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。二分查找又称折半查找,它是一种效率较高的查找方法。折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃...
2019-02-19 22:05:52 11023 2
原创 如何找出有环链表的入环点?
从上面的分析知道,当fast和slow相遇时,slow还没有走完链表,假设fast已经在环内循环了n(1<= n)圈。假设slow走了s步,则fast走了2s步,又由于fast走过的步数 = s + n*r(s + 在环上多走的n圈,环的长度是r),则有下面的等式:(1)2*s = s + n * r ;(2)=> s = n*r如果假设整个链表的长度是L,入口和...
2019-02-19 18:32:09 1607
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人