自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(203)
  • 资源 (1)
  • 收藏
  • 关注

原创 w1区块链基础知识25讲

11讲哈希值在现实世界的应用哈希函数:以任意长度的数据输入,输出固定长度的数值,比如 32byte 。这个值就称为哈希值,也可以称为 摘要 散列 指纹等。11.1数据对比目标就是对比两份数据不需要一一对比其中的数据内容,让任何数据的比较像比较两个哈希值那么简单。所以具体操作就是通过计算两份数据的哈希值,如果哈希值相同那么就可以认为数据相同。原理:哈希计算的防碰撞基础上才能认为是正确的。否则 不同的数据可能产生相同的哈希值。11.2数据监测数据连同哈希值x发送给接收方,接收方通过相同的哈希函数

2021-10-27 18:17:10 12188

原创 Thread类为什么要弃用stop resume suspend ?

1、stop对于stop方法会立即停止某个运行线程的执行,不管正在执行的线程在执行什么正常操作。所以如果直接stop 可能会导致文件不会正常关闭,try catch 也不会再执行。 另外 stop 会立即释放运行线程它锁定的监视器对象。这样会导致其他线程提前得到了未完全“初始化”的数据,导致数据不一致。This method is inherently unsafe. Stopping a thread with* Thread.stop causes it to unlock all

2021-09-20 13:32:33 203

原创 黑马-并发编程学习

1、查看 进程 杀死进程ps -fe | grep java或者使用jpstop -H -p pid 查看pid代表的进程的内部线程运行情况使用jstack 也可以查看进程的线程信息 使用方式是jstack pid使用jconsole 也可以查看某个进程的线程信息 (图形化界面)2、线程切换的原因时间片用完更高级别的线程执行stw 回收线程执行线程本身调用 sleep wait join park sychronized 等3、对象头Mark Word + klass Word +

2021-09-11 23:55:24 714 3

原创 collection 转Map

public static <E,K,V> Map<K,V> listToMap(Collection<E> collection, Function<? super E,? extends K> keyMapper,Function<? super E,? extends V> valueMapper){ if(collection == null || collection.size() == 0){ ...

2021-09-10 23:51:45 649

原创 AtomicInteger 原子类

1、getAndIncrement 方法底层使用了unsafe.getAndAddInt(object,offset,deta)int getAndAddInt(Object,offset,int deta){ int v ; do{ v = unsafe.getIntVolatile(object,offset); }while(!unsafe.compareAndSet(object,offset,v,v+1)) return v;}2、incrementAndGet()方

2021-09-06 11:59:04 60

原创 CMS垃圾收集器

1、可达性分析 & 引用计数法在cms垃圾收集器的初始标记的时候,标记的就是俩部分:一是 GC roots 引用的老年代对象 二是新生代引用的老年代对象。而可达性分析所用的GC roots 包括虚拟机栈 中本地变量表中的变量引用的对象、方法区中的静态变量、常量引用的对象、本地方法栈中的JNI引用的对象。2、CMS工作流程初始标记这时要stw并发标记用户线程和垃圾回收线程同时进行,从初始阶段标记的存活对象开始标记所有的存活的对象。由于用户线程也在运行,所以对象的申请以及老年代引用关系

2021-09-05 22:29:06 92

原创 Netty

selector在BIO中 serverSocket.accept() 会阻塞,而在NIO中使用selector来监视发生io事件的ServerSocket (accept事件) 以及SocketChannel (read connect write)。当有selector 中注册的SocketChannel 或者ServerSocketChannel 发生相应的事件后,selector 会通过监视相应的socket 通过select操作得到发生某种事件的SelectionKey集合。之后我们便通过Sel

2021-09-03 17:52:23 76

原创 线程池的使用-java

理解:线程池的顶级接口时Executor,其中只有一个execute方法,ThreadPoolExecutor 中有7个参数,是coreThread、maxThreads、keepaliveTime(超出核心线程的线程超时时间、超过该时间需要销毁线程) 、timeunit、BlockingQueue、ThreadFactory(可以自定义线程名)、Handler拒绝策略。 从阿里的java规范来说:直接使用ThreadPoolExecutor 而不是使用Executors 工厂方法来创建newFixedT

2021-09-02 14:48:57 176

转载 README

Spring如何解决循环引用的Bean 循环引用是什么?在 Spring 容器中,非懒加载的单例对象会在 IOC 容器创建后进行加载,而常说的 Spring 循环引用问题也是在此时发生的。假设,我想要向 Spring 容器注册两个单例对象 A 与 B,其中 A 对象存在 B 属性,B 对象存在 A 属性(由于单例的特性,该容器只会存在一个该类型的对象),因此会构成循环引用。图示与代码如下:@Component // 向容器注册一个单例(默认单例)对象 Aclass A{@Autowired //

2021-08-23 14:00:52 94

原创 操作系统概念学习

1、中断1.1 中断在实时控制、故障处理、计算机与外部设备之间数据传输往往采用中断系统【百度百科额】中断分为内中断(来自cpu内部的中断)和外中断(中断源来自cpu外部)。内中断主要有系统调用、软件异常、缺页中断等等, 外中断有io完成发出的中断、用户强行终止一个进程。中断是用户态进入内核态的唯一途径。中断发生意味着操作系统介入开始管理工作PSW 程序状态寄存器 主要保存俩类信息 一是指令执行结果的状态信息 比如进位信息等,另一类是控制信息比如 是否允许中断的标志位IF.1.2 外中断的处理过程st

2021-08-15 23:08:48 149

原创 操作系统概念学习

1、中断1.1 中断在实时控制、故障处理、计算机与外部设备之间数据传输往往采用中断系统【百度百科额】中断分为内中断(来自cpu内部的中断)和外中断(中断源来自cpu外部)。内中断主要有系统调用、软件异常、缺页中断等等, 外中断有io完成发出的中断、用户强行终止一个进程。中断是用户态进入内核态的唯一途径。中断发生意味着操作系统介入开始管理工作PSW 程序状态寄存器 主要保存俩类信息 一是指令执行结果的状态信息 比如进位信息等,另一类是控制信息比如 是否允许中断的标志位IF.1.2 外中断的处理过程st

2021-08-11 17:11:36 114

原创 缓存数据一致性

提出问题:在使用美团Squirrel 作为分布式缓存 ,那么缓存与数据库的一致性如何保证?如何尽可能拿到最新数据?(以单节点为例)方案1:先更新数据库后更新缓存​不推荐分析缺点:(1)AB两个线程写。A更新数据库->B更新数据库->B更新缓存->A更新缓存 显然出现了数据覆盖,此时数据不一致,是旧数据。(2)另外在更新数据库的时候还需要更新缓存,如果更新逻辑复杂,导致整个更新周期很长。解决方案:对于(1)可以增加版本号,版本号比目前大的才更新。对于(2)可以考虑任务异步化。

2021-08-04 17:19:18 105

原创 ThreadLocal学习

概述ThreadLocal 译为线程本地变量,适用场景有很多总结起来就是一个:只希望在本线程使用的变量。用户从浏览器发起请求,服务器有相应的线程处理请求,但是http无状态,session 可以用来保存一些状态只与用户此次会话相关,此时我们就可以使用线程本地变量来保存session。注意一个线程不是为一个用户服务的,当使用完成之后进行remove 本地变量,防止内存泄漏。同一个线程处理非常复杂业务的时候,可以将显式传递的参数当作线程本地变量,从而可以在多个方法中使用。在数据库连接的时候可以使用Thr

2021-08-04 17:10:03 127

原创 ConcurrentHashMap1.8学习

目标了解ConcurrentHashMap 工作原理。重点了ConcurrentHashMap的多线程下的扩容机制,TreeBin 、ForwardingNode 功能的认识,以及CAS和LockSupport的使用。预备知识重要属性源码讲解put 函数public V put(K key, V value) { return putVal(key, value, false); }final V putVal(K key, V value, boolean o.

2021-08-04 16:29:23 362 2

原创 ConcurrentHashMap1.7学习

目标学习ConcurrentHashMap 1.7 如何保证线程安全的,及其工作流程。预备知识为什么需要ConcurrentHashMaphashtable 只是简单地将需要同步的方法加上"synchronized",使得多个线程可能竞争同一把锁。HashMap 不能保证线程安全,甚至在并发环境元素成环导致cpu飙升。Collections.synchronizedMap 也是所有线程竞争同一把锁,该锁默认情况下Map实例,也可以自定义。volatile 关键字并发编程中的可见性、原子性、

2021-08-04 15:47:54 133

原创 哈希表1.8学习

目标通过hashMap 常用的put 和get 函数 来切入了解整个hashMap 的工作流程,了解红黑树的插入与删除,熟悉HashMap1.7 与1.8的异同,以及使用HashMap的最佳规范。预备知识红黑树的插入设待插入节点为 N(New),父节点为P(Parent)叔父节点 U(Uncle) 祖父节点为G(Grandpa)规定待插入的节点为红色如果父节点p为黑色,直接插入p为红色,1 叔父节点U 为null 旋转 + 变色 (旋转祖父节点)2 叔父节点 U 为 红色,变色 (U P

2021-08-04 11:27:32 3271

原创 哈希表1.7 学习

学习目标了解HashMap 1.7 整体结构,从put get 操作了解HashMap 工作流程,及其存在的问题。整体结构从一个算法题讲起如何得到大于或者等于某个正数的2的幂次方数?public int getBiggerOrEqual(int size){//假设size 是 大于0的// 大致分为 2 类数据 一类是本身就是符合要求的2 的幂次方数 另一类就是不符合 其二进制数有多个bit 为1if(size == 1){return 1;}return Integer.high

2021-08-04 10:45:53 220

原创 大数据相关 - topk、中位数

1、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。比较好的方案:使用Hash表做统计,使用堆做排序。即利用O(N) 的时间复杂度将查询串计数,按照将哈希表的数据遍历放入长度为10 的小顶堆中(排序度量是其查询次数),最后得到的就是

2021-07-26 22:15:48 167

原创 浅谈索引及其使用

1、MySQL 为什么建议使用自增主键?InnoDB 引擎是基于主键聚集的,数据记录是被存在于索引树的叶子结点上,这就要求索引树的叶子结点的各条记录按照主键排序,因此当有一个新的记录需要插入的时候,需要根据其主键的值插入叶子结点,如果叶子结点已满则开辟另一个数据页作为新的叶子结点。当我们使用自增主键时,记录按顺序被一条条加入索引树叶子结点中,形成紧凑的索引结构,每次插入记录时,不需要移动数据的开销,效率很高。 当我们使用非自增主键的时候,比如业务中的id,我们可以认为此时的主键id值为随机的,这样在插入数

2021-07-26 22:05:27 73

原创 一条SQL 语句的执行

查询一条sql语句 比如select * from tableA where ID = 10(假设没有索引),执行的时候 首先判断是否有权限,有的话就开始对表操作:1、调用执行引擎接口“获取表第一行”,判断该行是否ID = 10.如果是 加入结果集2、调用执行引擎接口“获取表下一行”,判断改行是否ID= 10,如果是 加入结果集3、如果执行最后时,将结果集返回。更新redolog更新时把记录从磁盘中找到,然后修改后刷入磁盘。整个过程非常耗时,所以InnoDB 设计了 redolog 操作

2021-07-24 21:30:28 216

原创 redo log和bin log 以及MySQL InnoDB内部的XA

知识回顾1、什么是redo log ?MySQL 可以分为 连接层、SQL 层、存储层。当sql执行的时候,对数据的修改如果每次都是刷到磁盘上,那么必然会造成大量的随机io,影响效率。所以可以使用redo log 来解决这个问题,即MySQL 对数据的修改只体现在buffer pool 的内存中,然后会在redo log 中记录修改。redo log 还保证了数据的持久性,即修改 的数据一定会最终持久化到磁盘上。redo log 本质上就是固定大小的文件,记录了一些事务的修改操作。注意InnoDB

2021-07-24 21:25:39 143

原创 DBMS自带的查询优化

在DBA或者用户执行SQL时候,首先会经过编译器编译,而编译的过程就就行了物理优化和逻辑优化,最终形成执行计划。知识-关系代数逻辑优化的基础是关系代数,关系代数的操作有 1、基本操作 并、差、笛卡尔积、选择、投影、连接。2、扩展操作 交、 θ连接(等值连接 、自然连接)3、扩展复杂操作 除 左外连接 右外连接 全外连接除操作适合描述这样的语义:sc(学生选课表) s# c# score Course(课程表) c# cname ccredit 求选修了全部课程的学生学

2021-07-24 13:20:26 513

原创 区块链推荐资料

2021-07-10 18:25:01 980 2

原创 贡献代码的方式

2021-07-10 17:45:43 79

原创 基于区块链的商品溯源平台的研究与实现

平台设计区块链高度透明、去核心、集体维护、不可更改伪造的特点使得供应链上的各个参与方增加了有效信息流通,避免了之前存在的数据孤岛,解决了传统供应链上数据可见性问题,数据信息存储在区块链上,使得仓储单位各方存储的产品相关的数据可追溯、不可篡改。设计目标1、该平台通过区块链网络将某商品供应链上下游核心企业、供应商、经销商等进行网联,各参与方共同维护一个共享帐本,让数据在各方进行存储、共享和流转,保证了链上所有各方能够可信、高效的同步信息,查询信息。2、采用严格的权限管理机制。3、查询性能满足商品溯

2021-07-10 01:37:16 9878 3

原创 智能合约的概念

技术上说,智能合约等价于一段事先就约定好逻辑和条约的代码被执行的状态。智能合约这一概念早在20世纪90年代就有人提出,这个人是从事智能合约和数字货币研究的尼克萨博(Nick Szabo)博士,尼克1996年在《Extopy》期刊上发表了对智能合约的描述,他认为智能合约是一个由数字表单指定的承诺,这个承诺包含关系到多方执行的一组协议。从定义中我们可以得知,智能合约由多个协议组成,这些协议包含了用户接口,能表达用户的承诺,它可以安全有效地确定公共网络上的关系。换句话说,智能合约是一个由计算机处理、可执行合约条

2021-07-09 17:26:33 361

原创 了解区块链

pow 作为典型共识算法,如何保持各个节点的一致性?比如全世界共有100个节点在争夺记账权,那么初始状态假设为区块链P,之后两个节点a,b分别同时计算出了合法的区块A,B,并广播。此时可能存在的情况是一些节点区块链为P->A,另外为P->B。此时就发生了不一致。假设之后的某时刻又有一个节点(P->B)c,产生了区块C,那么此时其区块链变为P->B->C,c节点广播区块时候就会将节点区块来呢为P->A 的节点转为 P->B->C,即选取最长链作为共识链。注意这

2021-07-08 23:51:41 104

原创 实习HashMap1.7

作为一条通用的规则,loadfactor 设置为0.75.这是时间和空间的权衡选择,要是特别大那么可能存在这样的情况:hash冲突特别严重但是就是没达到阈值,而如果小点的话就能减轻这种情况。所以 loadfacor 特别大应该会影响get 和put 操作的时间复杂度。特别小的时候又会造成空间的浪费。“collection views method” 会fail fast 抛出并发修改异常。如何找到大于等于某个数的最小2的幂次方数? private static int roundUpToPowe

2021-06-19 13:30:58 161

原创 inode理解

inode 为索引结点包含文件元信息:大小、uid、gid、指向block的指针而文件的具体内容会被放在block中。目录项:包含的文件名+文件名对应的inode编号所以我们访问文件的过程是首先通过文件名找到inode编号,inode编号->inode,然后通过inode找到block 从而找到文件内容。硬连接:通过文件系统对某个inode产生新的文件名,而不是产生新的文件软链接:再创立一个独立的文件,该文件的内容为被创立软链接文件的名字。这样新文件可以通过访问其内容从而访问原来的文件。

2021-05-20 22:21:56 108

原创 LongAdder 的理解与使用场景

Doug lea 在jdk注释中写了这样一段话来解释:该类在多线程更新一个公共的sum(该sum收集统计信息)比AtomicLong 更加高效,而不是应用于细粒度的并发控制。在少量的并发下AtomicLong 与LongAdder 具有相似的性能,但是大量并发下LongAdder更加优秀,但是需要更多的内存。具体使用场景:假设我们使用CurrentHashMap 来统计string 的频率 由于频率值可能会被并发修改 所以可以考虑使用LongAdder.该类继承自Number但是并没有定义equals

2021-05-19 18:09:30 1024

原创 设计模式之模板设计模式

模板设计模式 是父类进行顶层设计,子类进行具体实现。比如在ReentrantLock 中lock的时候,其实就是调用子类NonFairLock 的lock方法,而该方法的设计是由父类Sync设计,子类NonfairSync 实现Lock方法。优点:父类封装不变部分 子类扩展可变部分。 父类设计 子类实现。...

2021-05-15 15:04:05 54

原创 ThreadLocal 的理解

ThreadLocal 主要是变量的线程间隔离,即线程本地变量。比如有一个变量 需要在不同的线程中使用,就像各个线程都有各自的一份一样,操作互不影响。其主要操作有set get remove 。set 操作:拿到当前线程对应的ThreadLocalMap 如果为空则需要创建ThreadLocalMap 并初始化一个Entry。如果不为空则需要在ThreadLocal 中找到key为ThreadLocal 的entry 或者未找到的话创建一个新的entry.get 操作可以找到该线程的ThreadLoca

2021-05-13 20:57:02 84

原创 synchronized面试总结

java 对象头 有一个部分叫做MarkWord 占32 位或者64位。用来表示对象的状态 倒数第三位为1 且 最后两位为01代表该对象处于可偏向状态。 所以当synchronized 关键字 锁定对象进行同步代码块时,首先检查对象是否可偏向,如果可以则通过cas设置MarkWord 的高位地址为该线程的地址,成功之后 之后该线程再次获取锁对象的时候,检查其高位线程id为自己则直接进入同步代码块。对于轻量级锁 是线程栈帧中生成一个Lock Record (复制锁对象的Mark word + owner 指

2021-05-05 15:52:33 108

原创 LockSupport 的理解

Locksupport 理解LockSupport 的构造方法都是私有的。对于创建锁或者其他同步类是基本的线程阻塞原语。LockSupport 与使用它的线程 以及 permit 关联,如果permit 可用的话,park 函数调用使得会立即返回,并消费掉一个permit,否则线程会阻塞。如果之前permit 不可用的时候 即数量为0 的时候,unpark 会使得permit 再次可用,注意与semaphore不同,permit数量不会累积,其数量最多为1 个。park 和unpark用来阻塞或者恢复

2021-05-04 17:41:10 110

原创 java 中thread.interrupt 作用

thread.interrupt() 并不是中断该线程,而是告诉该线程该中断了,具体停止线程还是需要被中断的线程来自己控制。比如处于阻塞态的如调用Thread.sleep() object.wait() 或者 Thread.join() Thread.yield() 等处于waited 状态时被中断的时候会InterruptedException异常。interrupt 方法涉及的目的是提示该线程应该终止了,而不是立即终止线程。如果线程处于正常运行状态,如果被中断那么该线程很可能会继续运行下去除非检测线程

2021-05-02 18:04:18 578

原创 AQS java并发基石

AQS是java locks 包下的一个基础包,实现了serializable 接口 继承了 AbstractOwnableSynchronizer 。其 重要的类属性有state 代表其状态,Node head tail 代表队列,还有AbstractOwnableSynchronizer 的exclusiveOwnerThread。ReentrantLock的 lock的方法底层就是使用了aqs ,比如Thread 1 和Thread2 同时想要竞争一把锁,即同时想执行 lock方法,则结果是只能有一

2021-05-02 17:09:16 97

原创 负载均衡:加权轮询算法 一致性哈希算法

需求:如何将请求按照权值 分配给服务器。大致思想:需要两个全局变量currentWeight 初始化为最大权值 和currentIndex 初始化为0 。从currentIndex开始遍历 找到索引对应Node权值大于等于currentWeight 时候返回Node的ip,同时若currentIndex = currentIndex + 1 后为服务器总数即越界,那么需要重置currentIndex = 0;同时判断currentWeight = currnetWeight - max 更新后的值是否为0

2021-04-29 00:30:41 710 1

原创 JDK 1.8ConcurrentHashMap 理解

1.8 currentHashMap不同于1.7 的分段加锁 、分段扩容,1.7虽然也能做到多线程并发的扩容,但是效率不高。1.8currentHashMap 的put操作会对table (key,value)对应的索引位置上的元素检测,如果是空直接cas放置,否则进行加锁操作,这时候就可能是链上的放置 或者树上的放置。完成之后需要对整个currentHashMap 的元素个数加1,这时的操作类似longAdder 来进行多线程下的同步增加个数1,具体原理就是尝试性的进行cas+1操作,如果不成功则利用

2021-04-25 16:12:23 404

原创 JDK 1.7ConcurrentHashMap 的理解

CurrentHashMap 中采用分段加锁,扩容操作也是针对某个segment,segment 是继承 Reentrantlock 来实现并发安全的。put操作的逻辑是这样的,首先需要找到Segment数组中的索引来找到该(key,value)应该放到哪个Segment 中,注意segment不存在的时候需要创建,这时候就需要cas 来保证只有一个线程来创建,其他线程使用这个线程创建好的Segment.拿到segment后需要put 到其正确的HashEntry[]数组中的某个位置上,这时候需要进行加锁,

2021-04-23 17:55:02 197

原创 Java中的Unsafe 类 概述

使用unsafe类 在juc 包 以及CurrentHashMap 以及Netty 等高性能IO框架中应用广泛。但是对于普通程序员来说应该谨慎使用,防止内存泄漏。1、内存操作unsafe.allocateMemory(long bytes);/*o == null 时 offset 就是绝对偏移量 初始化字节数为 bytes 值为value*/unsafe.setMemory(Object o,long offset,long bytes,byte value);unsafe.freeMemor

2021-04-23 14:29:41 250

cs small chat

java大作业 类似qq的大作业 cs

2017-04-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除