ReadWirteLock读写锁源码分析 首先看构造方法然后看获取读锁和获取写锁方法以上表示内部有2把锁,一把读锁一把写锁,这两把锁都有一个变量为sync同步器(也就是aqs),在reentranReadWirteLock构造方法里初始化了读锁和写锁,并在初始化读写锁方法里将读写锁的同步器设置为reentranReadWirteLock的同步器。所以实际上虽然有2把锁,但用的是同一个aqs。。。未完待续...
一文读懂NIO 前言NIO看了好多的博客、视频,都学不明白,最多只是单纯的记住了代码而已,时间一久就忘得一干二净,更不用说学习更牛逼的Netty,Nginx,Redis的底层原理了。所以这篇博客从底层讲起,从操作系统上的BIO到Non-blocking IO到Java中的NewIO,只有真正理解了原理,才能学会NIO。操作系统知识首先要有一点操作系统的前置知识。系统调用的概念都知道操作系统中分为用户态(可以理解为应用程序所在的空间)和内核态(可以理解为操作系统内核所在的空间)。用户态是不能直接访问内核态的,要访
多个线程做排序,返回最早排序好的线程的结果 多个线程做排序,返回最早排序好的线程的结果最近面天猫,面试官出了一道这样的题:假设有一个排序方法,里面起了5个线程、分别用一个排序算法做排序操作,这个方法返回5个线程中最快排好序的结果。一下子把我问懵了,我知道主线程等待多个线程执行完毕再执行可以用join,但主线程等待任意一个线程执行完毕就执行,我没想过这个问题。不过我倒是知道这个问题肯定是问的juc下的那些新的同步锁,只是一下子脑子突然懵了有点想不起来。最终只想到一个countDownLatch,遗憾了(虽然就算答出来应该也过不了面试~)。实
ThreadLocal全解析以及Java的强软弱虚引用 ThreadLocal全解析最近在面试一家还算二三线的略知名厂时,被问到了ThreadLocal,虽然大致的使用方式是回答出来了,但面试官问到使用ThreadLocal需要注意什么,以及它为什么会导致内存泄漏的问题时,就一脸懵逼了。所以写篇文章记录一下。ThreadLocal本身并不复杂,但面试一旦被问到,拖个5-10分钟还是没问题的,感觉也算是一个有“性价比”的知识点。Java的四种引用(强软弱虚)首先需要一点前置知识,Java中实际上有4种引用。强引用在之前的学习中了解到gc会收集那些没
多线程之 线程池总结 JDK提供2种线程池,ThreadPoolExecutor、ForkJoinPool这里先写ThreadPoolExecutor 有时间再写ForkJoinPoolThreadPoolExecutorJDK提供4种默认的线程池,实际上他们的底层都是ThreadPoolExecutor,通过传入构造方法的7个参数实现不同的功能Executors.newSingleThreadExecutor(); // 单个线程的线程池Executors.newCachedThreadPool(); // 0个核心
hashmap 源码阅读总结记录 初始化方法时 最大容量为什么是 2的30次方因为扩容是左移,如果1<<30还左移就是2的31次方了,比整形的最大值还大(整形溢出)初始化:判断是否最大容量检查负载因子设置阈值 初始值为12 阈值为16 大于初始值的最小的2的n次方问题: 怎么计算出来的然后就没了:说明初始化时并没有初始化hash表补充:里面有很多transient关键字,表示序列化时不需要保存put方法:可重复put 覆盖原值取hash值:问题:为.
四种 I/O控制方式 https://www.jianshu.com/p/eb5b9c539c3eI/O控制方式设备管理的主要任务之一是控制设备和内存或处理机之间的数据传送,外围设备和内存之间的输入/输出控制方式有四种,下面分别介绍。1 程序直接控制方式在早期的计算机中,由于无中断机构,处理机对I/O设备的控制采用程序直接控制方式,或称为忙-等待方式。如图(a)所示,计算机从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的..
Zookeeper应用 配置管理和分布式锁 由于zk的一些特性:速度快、高可用、临时节点、序列节点、watcher等所以可用zk来实现分布式的配置管理(如注册中心) 或者 分布式锁这里简单用java + zk来实现准备idea新建springboot项目,主要是POM要引入Zookeeper的包,注意包的版本必须和zk服务器的版本一致!分布式配置如图,分布式节点连接zk集群,watch其中的节点数据(配置),则在节点数据被修...
Zookeeper入门 集群安装 官网的介绍意思是数据节点是一个树形结构,有点类似于文件系统,比如要访问a目录下的b目录下的c文件就是/a/b/c但不同于文件系统,他的每一个层级也是一个数据节点,比如a也是一个数据节点,能保存数据的节点类型有2种:永久节点、短暂节点永久节点就是普通节点短暂(临时)节点就是指这个节点的存在依赖于zk和client的连接(session),当zk或者client挂了时,session消...
VMware 新建一个基本的Linux虚拟机与快照克隆 新建一个能联网,有jdk的linux虚拟机,便于克隆复制多个节点出来1.新建一个虚拟机后,修改网络配置vm 网络设置nat,具体百度。这里给vm设置了192.168.153.0的子网,192.168.153.1是vm外部的网卡ip 192.168.153.2是vm内部的网关cd /etc/sysconfig/network-scriptsvi ifcfg-ens33 文件ONBOOT=...
redis 主从集群及哨兵机制 主从集群设置进入utils目录./install_server,安装3个6379 6380 6381的服务复制生成的/etc/redis/63xx.conf的3个文件到新建的test目录下修改复制过来的3个配置文件,关闭后台运行,关闭日志输出至文件(可在前台观察到日志输出)分别按照几个配置文件启动分别用redis-cli连接replicaof host port命令,可将从连接主主...
设计模式之责任链模式 责任链模式就是:A B C三个任务处理的类,通过setNext方法组成一个链表(责任链),当一个任务到来时,在链表中依次往下流转,遇到能处理这个任务的节点时,任务被处理,否则继续往下流...
LeetCode 347 PriorityQueue 解这类求"前k个"的题目,关键是看如何定义优先级以及优先队列中元素的数据结构。题目中有”前k个“这样的字眼,应该很自然地联想到优先队列。优先级别可以由字符串出现的次数来决定,出现的次数越多,优先级别越高,反之越低。统计词频的最佳数据结构就是哈希表(HashMap),利用一个哈希表,就能快速地知道每个单词出现的次数。将单词和其出现的次数作为一个新的对象来构建一个优先队列,...
双向链表+HashMap 实现LRU算法(leetcode 416) import java.util.HashMap;/** * @author MasterYee * @Description: * @date: 2020/3/29 */public class LRUCache { class Node{ int key; int value; Node pre; Node...
代理模式之CGLIB动态代理 出处CGLIB(Code Generation Library)详解什么是CGLIBCGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在githu...