JAVA
文章平均质量分 88
JAVA
松myth
这个作者很懒,什么都没留下…
展开
-
BIO、NIO、AIO详解
Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。转载 2023-04-20 10:47:09 · 1037 阅读 · 0 评论 -
io多路复用的原理和实现
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(NewIO)库。(3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Li...转载 2021-08-12 19:08:23 · 4422 阅读 · 0 评论 -
ConcurrentHashMap底层结构与实现原理
前言HashMap是一个非常优秀的类,使用也非常频繁。唯一的遗憾就是HashMap不是线程安全的。前置阅读:HashMap底层结构与实现原理HashMap多线程扩容导致死循环解析(JDK1.7)理解了HashMap,再来看ConcurrentHashMap会有事半功倍的效果,因为ConcurrentHashMap底层数据结构、核心方法几乎和HashMap一模一样,只是在多线程环境下做了很多保证线程安全的操作。JDK早期提供了线程安全的HashMap类,那就是Hashtable,底层转载 2021-08-12 15:52:49 · 1408 阅读 · 0 评论 -
TreeSet
TreeSet集合:可以对Set集合中的元素进行排序。是不同步i的。 判断元素唯一性的方式:根据比较方法的返回值来判断。是0(零)就存入集合,不是0就不存。因为Set集合是不能有重复的元素,无序。 既然是无序的集合。我们有时为了到达需求,需要使它变得有序,那怎么办呢? TreeSet对元素排序的方式一: 让元素自身具备比较排序功能,具备比较排序功能的元素只需要...转载 2021-08-12 15:24:17 · 142 阅读 · 0 评论 -
TreeSet &TreeMap的底层实现
TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。TreeSet 和 TreeMap 的关系为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.转载 2021-08-12 15:23:03 · 403 阅读 · 0 评论 -
HashMap多线程扩容1.7导致死循环解析及1.8优化
前言前一篇 HashMap底层结构与实现原理 遗留了一个问题:JDK1.7中的HashMap在多线程情况下扩容可能会导致死循环。本篇就这个问题进行讲解。扩容死循环前一篇深入的讲解了HashMap1.7扩容的过程,这里回顾一下在扩容过程中,单链表的表现,相关的代码如下void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; // 外层循环遍历数组槽(slot)...转载 2021-08-11 20:58:48 · 625 阅读 · 0 评论 -
布隆过滤器
什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。实现原理HashMap 的问题讲述布隆过滤器的原理之前,我们先思考一下,通常你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实可以将值.转载 2021-08-11 20:15:59 · 123 阅读 · 0 评论 -
CSRF跨域攻击及预防
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF二.CSRF可以做什么? 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。三.CSRF漏洞现状 C转载 2021-08-11 20:02:54 · 784 阅读 · 0 评论 -
ThreadLocal原理
概述在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal就是“线程局部变量”的意思。简单的说就是,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)。可能一开始把这句话放出来很难理解,那我们就继续往后面看吧。API介绍再学习一个类之前我们需要了解一个类的API,这也是我们学习类的入口。而ThreadLocal类的API相当简单。在这里面比较重要的就是,get、set、remove了,.转载 2021-08-11 14:36:47 · 296 阅读 · 0 评论 -
BlockingQueue(阻塞队列)详解
一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。二. 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示: 从上图我们可以很清楚看到,通过一个共享的队列,可以使得数转载 2021-08-11 11:38:26 · 184 阅读 · 0 评论 -
线程池流程图
默认构造函数public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { ....}转载 2021-08-11 10:42:15 · 484 阅读 · 0 评论 -
Java锁--Lock实现原理(底层实现)
关于java lock的底层实现原理,讲的有点深,转载学习!Lock完全用Java写成,在java这个层面是无关JVM实现的。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异,因此我们以ReentrantLock作为讲解切入转载 2021-08-08 16:01:18 · 1882 阅读 · 2 评论 -
Java 并发编程:synchronized、volatile
Java 并发编程:核心理论并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式、实现源转载 2021-08-07 14:58:19 · 461 阅读 · 0 评论 -
CAS算法与ABA问题
锁是用来做并发最简单的方式,当然代价也是最高的。独占锁是一种悲观锁,synchronized就是一种独占锁;它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起直到持有锁的线程释放锁。所谓乐观锁就是每次不加锁,假设没有冲突而去完成某项操作;如果发生冲突了那就去重试,直到成功为止。CAS(Compare And Swap)是一种有名的无锁算法。CAS算法是乐观锁的一种实现。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存转载 2021-08-06 14:12:59 · 210 阅读 · 0 评论 -
深入理解final关键字
final 是Java 中重要关键字之一,可以应用于类、方法以及变量上。这篇文章中将讲解什么是 final 关键字?将变量、方法和类声明为 final 代表了什么?使用 final 的好处是什么?final 关键字是什么?final 在 Java 中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作 final,你将不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。final 变量凡是对成员变量或者本地变量(在方法中的或者代码转载 2021-08-07 13:47:17 · 281 阅读 · 0 评论 -
HashMap实现原理及源码分析&为何选用红黑树
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行讲解,然后会对JDK7的HashMap源码进行分析。目录 一、什么是哈希表 二、HashMap实现原理 三、为何HashMap的数组长度一定是2的次幂? 四、重写equals方法需同时转载 2021-08-06 11:28:23 · 376 阅读 · 0 评论 -
算法一看就懂之「 递归 」
一、「 递归 」是什么?递归就是指函数直接或间接的调用自己,递归是基于栈来实现的。递归的经典例子就是斐波拉契数列(Fibonacci)。一般如果能用递归来实现的程序,那它也能用循环来实现。用递归来实现的话,代码看起来更清晰一些,但递归的性能并不占优势,时间复杂度甚至也会更大一些。上图为 斐波拉契数列 图例。要实现递归,必须满足2个条件:可调用自己 就是我们要解决的这个问题,可以通过函数调用自己的方式来解决,即可以通过将大问题分解为子问题,然后子问题再可以分解为子子问题,这样不停的分解。并..转载 2021-08-02 19:22:02 · 116 阅读 · 0 评论 -
算法一看就懂之「 队列 」
一、「 队列 」是什么?队列(queue)是一种先进先出的、操作受限的线性表。队列这种数据结构非常容易理解,就像我们平时去超市买东西,在收银台结账的时候需要排队,先去排队的就先结账出去,排在后面的就后结账,有其他人再要过来结账,必须排在队尾不能在队中间插队。「 队列 」数据结构就是这样的,先进入队列的先出去,后进入队列的后出去。必须从队尾插入新元素,队列中的元素只能从队首出,这也就是「 队列 」操作受限制的地方了。与堆栈类似,队列既可以用 「 数组 」 来实现,也可以用 「 链表 」 来实现。转载 2021-08-02 19:21:06 · 459 阅读 · 0 评论 -
算法一看就懂之「 堆栈 」
一、「 堆栈 」是什么?堆栈(stack)是一种先进后出的、操作受限的线性表,也可以直接称为栈。可以把栈想象成一个桶一样,往这个桶里面一层一层的放东西,先放进去的在里面,后放进去的东西依次在外面。但取东西的时候就是先取靠近外面的,再依次一层层取里面的。这就是 后进先出( Last In-First Out )的原则。因此「 栈 」虽然是线性的,有2个端:顶端和底端,但它只允许从一端进行插入和删除数据,这就是为啥前面说「 栈 」是操作受限的了。栈只有两种操作:Push 和 Pop 。我们.转载 2021-08-02 19:19:31 · 254 阅读 · 0 评论 -
算法一看就懂之「 数组与链表」
数据结构是我们软件开发中最基础的部分了,它体现着我们编程的内功。大多数人在正儿八经学习数据结构的时候估计是在大学计算机课上,而在实际项目开发中,反而感觉到用得不多。其实也不是真的用得少,只不过我们在使用的时候被很多高级语言和框架组件封装好了,真正需要自己去实现的地方比较少而已。但别人封装好了不代表我们就可以不关注了,数据结构作为程序员的内功心法,是非常值得我们多花时间去研究的,我这就翻开书复习复习:本文就先从大家最经常使用的「 数组 」和「 链表 」聊起。不过在聊数组和链表之前,咱们先看一下数据的逻辑结转载 2021-08-02 19:15:08 · 134 阅读 · 0 评论 -
分布式锁解决并发的三种实现方式
分布式锁解决并发的三种实现方式在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同 一时间内只能被同一个线程执行。在单机环境中,Java中其实提供了很多并发处理相关的API,但是这些API在分布式场景中就无能为力了。也就是说单纯的Java Api并不能提供分布式锁的能力。所以针对分布式锁的实现目前有多种方案: 分布式锁一般有三种实现方式: - 1. ==数据库锁== - 2. ==基于Redis的分布式锁== - 3转载 2021-08-02 13:51:26 · 644 阅读 · 0 评论 -
volatile关键字
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。synchronized同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用synchronized 修饰的方法 或者 代码块。v.转载 2021-08-02 13:48:18 · 68 阅读 · 0 评论 -
Guava教程-RateLimiter
简介Google Guava library中提供了RateLimiter类,它经常用于限制对一些物理资源或者逻辑资源的访问速率。与Semaphore 相比,Semaphore 限制了并发访问的数量而不是使用速率。RateLimiter类定义如下:com.google.common.util.concurrent.RateLimiter@ThreadSafe@Betapublic abstract class RateLimiterextends ObjectGuava Docs关于Ra转载 2021-07-30 11:36:37 · 683 阅读 · 0 评论 -
java项目——大数据量的处理
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小...转载 2019-11-04 15:55:14 · 3144 阅读 · 0 评论 -
Unable to start embedded Tomcat Caused by: org.apache.catalina.LifecycleException: A child container
[09-23 17:03:36,203 ERROR] [Tomcat-startStop-1] core.ContainerBase - A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to st...原创 2019-09-23 17:35:02 · 482 阅读 · 0 评论 -
数据库索引及基础优化入门
数据库索引及基本优化入门一前言 经常在面试中发现很多人工作了好多年了,项目经验也不少,用过各种数据库,但大都不知道这些SQL语句背后的基本原理,更别说数据库优化了。平时做项目只知道实现功能,懒得学习,懒得思考,懒得看书(其实本人也是,不要找借口说这是China国情,项目是给boss做的,但技术和成长是你自己的)。 本篇文章主要讲...原创 2018-01-04 23:17:38 · 3520 阅读 · 0 评论