- 博客(67)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 idea以任意顺序debug多线程程序
在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法。1 debug 两类 Supspend在断点处右键,可以看到Suspend分两类,一类是All,一类是Thread。当某个线程到达断点处会触发Suspend,All会使得所有线程都暂停,Thread只会使当前触发的线程暂停,其他线程不受影响。在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法。1 debug 两类 Supspend在断点处右键,可以看到Suspen
2021-08-29 18:51:11 521
原创 动力节点—2020最新Spring教程笔记(上)
文章目录1 Spring 概述2 IOC 控制反转2.1 基于XML的DI2.1.1 注入分类2.1.1.1 set注入2.1.1.2 构造注入(了解)2.1.2 自动注入2.2 基于注解的DI3 AOP面向切面编程3.1 AOP术语3.2 AspectJ3.2.1 切入点表达式3.2.2 5种通知类型根据动力节点2020Spring笔记整理而成,视频地址https://www.bilibili.com/video/BV1nz4y1d7uy/。1 Spring 概述Spring 根据代码的功能特点,使
2021-08-22 19:31:36 406
原创 动力节点—2020最新MyBatis教程笔记
文章目录1 介绍2 快速入门2.1 操作步骤(P9)2.1.1 首先创建maven2.1.2 接着会做一些配置2.2 在编译的target目录下面缺少xml的解决方式(P11)2.3 日志的输出2.4 注意事项2.5对各个对象的分析**Resources** **类****SqlSessionFactoryBuilder** **类****SqlSessionFactory** **接口****SqlSession** **接口**2.6 工具类3 MyBatis DAO代理3.1两种sql的执行方式3.2
2021-08-15 20:49:03 657
翻译 pycharm调试flask在python2下失败的解决
参考下面的第一个回答https://stackoverflow.com/questions//pycharm-returns-non-asciii-error-on-running-i2021-07-281、在报错的文件pydevd.py中查找pydev_monkey并进入2、在pydev_monkey.py中from _pydevd_bundle.pydevd_command_line_handling import setup_to_argv下面一行添加args = args[1:]即可.
2021-07-28 14:23:33 271 1
原创 尚硅谷JavaWeb_2020idea_王振国_学习笔记
项目是书城项目,感觉不太完整。在讲各种web技术的同时,顺带做下项目。该项目没有使用SSM、SSH等框架,Javaweb三层框架都是直接写的代码。大致熟悉一下流程即可,在真正开发的时候会用框架来做。B站地址:https://www.bilibili.com/video/BV1Y7411K7zz?p=1网盘视频和相应资料文件地址:尚硅谷公众号回复 Java 获取。在第一个Java基础文件夹中,找尚硅谷JavaWeb_2020idea新版。前置知识:Java入门、数据库和JDBC。同样方式获取资料。
2021-06-17 20:47:11 2764 3
原创 ArrayBlockingQueue源码解析(基于JDK8)
文章目录1 介绍2 添加2.1 add2.2 offer2.3 put2.4 enqueue3 删除3.1 remove3.2 poll3.3 take3.4 dequeue4 其他BlockingQueue 称为堵塞队列,可以向队列中添加元素,也可以从队列中取出元素。当队列为空时,取出可以返回失败,抛出异常或者堵塞;当队列满时,添加可以返回失败,抛出异常或者堵塞。堵塞的方法分别是 put/take。生产者和消费者问题可以通过堵塞队列实现,只需要在队列为空或满的时候堵塞就行了。Throws
2021-05-23 16:52:48 109
原创 CopyOnWriteArrayList源码解析(基于JDK8)
文章目录1 基本属性和方法2 读3 写3.1 add3.2 remove3.3 set/clear4 迭代器5 copyOnWriteArraySetCopyOnWriteArrayList 是一种写时复制的 ArrayList,在写操作时加锁,拷贝原数组成员,在拷贝的数组上进行修改,并重置数组。该类对于读写可以并发执行,如果写线程还未重置数组,读到的是旧数据;如果已经重置,读到的是新数据。1 基本属性和方法写时使用 ReentrantLock 加锁。内部数组 array 存储数据,用 volati
2021-05-15 14:49:58 411 6
原创 ReentrantReadWriteLock源码解析(基于JDK8)
文章目录1 介绍1.1 ReentrantReadWriteLock1.2 state1.3 HoldCounter2 读锁2.1 读锁的获取2.1.1 tryAcquireShared2.1.2 fullTryAcquireShared2.1.3 readerShouldBlock2.1.4 tryReadLock2.2 读锁的释放3 写锁3.1 写锁的获取3.1.1 tryAcquire3.1.2 writerShouldBlock3.1.3 tryWriteLock3.2 写锁的释放4 锁降级1 介
2021-05-04 19:48:38 152 3
原创 ThreadLocal源码解析(基于JDK8)
文章目录1 ThreadLocalMap1.1 弱引用问题1.2 构造器1.3 set1.3.1 replaceStaleEntry1.3.2 expungeStaleEntry1.3.3 cleanSomeSlots1.3.4 rehash1.3.5 expungeStaleEntries1.3.6 resize1.4 get/remove2 ThreadLocal2.1 childValue2.2 threadLocalHashCode2.3 其他3 ThreadLocal 的简单使用ThreadLo
2021-04-24 21:23:49 184
原创 Semaphore源码解析(基于JDK8)
文章目录1 介绍2 tryAcquireShared3 tryReleaseShared4 构造器和其他5 使用5.1 简单使用5.2 尝试可重入5.3 直接释放1 介绍Semaphore 称为信号量,也是一个共享锁。通过一个内部类 Sync 继承 AQS,并重写了 tryAcquireShared和 tryReleaseShared。共享锁具体原理可以见我 AQS 的第二篇。AQS(二)共享锁必须给初始的资源个数 state。每次 acquire 都会减少 state,如果为 0,会堵塞;relea
2021-04-18 16:36:43 104
原创 CountDownLatch源码解析(基于JDK8)
文章目录1 介绍2 CountDownLatch 的方法3 总结及使用1 介绍CountDownLatch是一种AQS共享锁,可以看之前的介绍AQS(二)共享锁(基于JDK 8)CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前
2021-04-11 21:19:45 144
原创 ReentrantLock源码解析(基于JDK8)
文章目录1 介绍2 lock2.1 lock2.2 acquire2.3 tryAcquire3 unlock4 ReentrantLock4.1 构造器4.2 其他5 ReentrantLock 使用1 介绍前置知识,可以看AQS(一)独占锁(基于JDK 8)ReentrantLock 是一个可重入的独占锁。在独占模式中,isHeldExclusively 为 true 表示是对当前线程加锁,false 表示未加锁或者对其他线程加锁。加锁状态由 state 标识,如果为0,则说明未加锁,如果大
2021-04-01 21:38:47 137
原创 AQS(三)条件队列(基于JDK 8)
文章目录1 介绍1.1 Node2 await2.1 addConditionWaiter2.2 unlinkCancelledWaiters2.3 fullyRelease2.4 isOnSyncQueue2.5 checkInterruptWhileWaiting2.6 reportInterruptAfterWait3 signal/signalAll3.1 doSignal/doSignalAll3.2 transferForSignal4 总结和使用1 介绍参考: https://segmen
2021-03-30 21:32:42 490
原创 AQS(二)共享锁(基于JDK 8)
文章目录1 介绍2 锁的获取 acquireShared2.1 doAcquireShared2.2 setHeadAndPropagate2.3 和独占锁的比较3 锁的释放 releaseShared3.1 doReleaseShared1 介绍上一篇文章,讲了独占锁,AQS(一)独占锁(基于JDK 8),本篇只讲独占锁。某些共享锁使用的方法在独占锁中已经出现了,不再介绍,请读者自行去上面查看。在 Semaphore 中,acquire 调用的是 acquireSharedInterruptibl
2021-03-29 21:06:45 113
原创 AQS(一)独占锁(基于JDK 8)
文章目录1 介绍1.1 state1.2 Node1.3 模板方法1.4 其他2 锁的获取 acquire2.1 acquire2.2 addWaiter2.3 enq2.4 acquireQueued2.5 shouldParkAfterFailedAcquire2.6 cancelAcquire3 锁的释放release3.1 unparkSuccessor3.2 从尾遍历的原因(尾分叉)4 其他方法1 介绍在开始之前,先推荐一本书和两个博客,书是《Java并发实现原理:JDK源码剖析_出版社 电子
2021-03-28 18:06:15 192
原创 idea中查看方法或者类的实现快捷键
光标定位到方法名或类名,或者选中方法名或类名。Ctrl + Alt + B或者ctrl+Alt+鼠标左键: 可以找到方法或者类的实现,对于方法来说会找到实现或者被调用的地方。在我的测试中,上述快捷键可能会失败,No implementations found。这时候去该类的某一个子类里面,光标定位到该类,可行。下面以查看 List 的实现为例,在List .java里面使用快捷键找不到下面去 ArrayList.java 中,光标定位到 List 的位置,使用上述快捷键即可。3.Ctrl.
2021-03-26 21:55:09 5374
原创 LongAdder 源码解析(基于 JDK 1.8)
文章目录1 LongAdder2 Striped64LongAdder 和 LongAccumulator 基本一致,区别在于前者默认是加法,后者会同时传入一个表达式,具体结果是通过二元表达式计算得到的。DoubleAdder 和 DoubleAccumulator 没有做什么,只是使用 Double.longBitsToDouble和 Double.doubleToRawLongBits进行 Long 和 Double 的转换,剩下的和前面两个类一样。1 LongAdderLongAdder 继
2021-03-16 20:15:21 122
原创 AtomicStampedReference源码解析(基于 JDK 1.8)
文章目录1 Stamped 和 Markable的比较2 介绍3 其他方法4 代码示例在 atomic 包中,有三个 Reference 相关的类:AtomicReference,AtomicStampedReference,AtomicMarkableReference。AtomicReference 无法解决 ABA 问题,而后面的两个类特别是 AtomicStampedReference 能够很好地解决 ABA 问题。ABA问题可以见我前面的文章 unsafe 介绍(二)与CAS1 Stamp
2021-03-15 22:32:33 141
原创 CSDN 图片水印的一种解决方式
我是用 markdown 写的,富文本不清楚,大家可以试一下。根据我的实验,发现上传图片时有时候有水印,有时候没有水印。1.有水印是这样![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314191844618.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTY3Nzg5OQ==
2021-03-14 19:36:58 188
原创 JDK 源码阅读配置
起初我看的是韩顺平老师的各种配置,现在那个视频已经不存在了,可以看别人截的屏。老师用的是 Oracle JDK 8,我发现很多类看不到,所以导入了 OpenJDK8,记录一下整个配置过程。我安装的是 JDK8,但是导入 OpenJDK 一样没有问题。可以在我的公众号获取相应的OpenJDK:Java与大数据进阶1 Settings 设置首先找到 File—Settings—Build,Execution,Deployment—Debugger—Stepping,如图。将下面的 Do not s
2021-03-14 18:28:14 139
原创 AtomicIntegerArray 源码解析(基于 JDK 1.8)
文章目录1 偏移量的计算2 其他3 使用AtomicIntegerArray 可以原子的更新 int[] 中某个对象。在找到数组第0个对象的偏移量之后,由于数组中每个对象是顺序排放的,可以根据对象大小计算出数组中某索引的偏移量,然后通过 Unsafe 相关的方法来获取或者修改。1 偏移量的计算假设数组中第 0 个对象的在数组中的偏移量为 x,每个对象的大小为 y,那么数组中第 i 个元素在数组中的偏移量为 x+i*y。下面是具体实现。base 表示的就是第 0 个对象的偏移量 x,scale 或者
2021-03-13 09:17:27 102
原创 AtomicIntegerFieldUpdater 源码解析(基于 JDK 1.8)
文章目录1 介绍2 具体实现类2.1 部分预备知识2.2 初始化2.3 Unsafe 相关3 实际使用3.1 AtomicIntegerFieldUpdater 的使用3.2 Reflection.getCallerClass()1 介绍AtomicIntegerFieldUpdater 是将某个类 T 的某个 int 属性包装一下,使得该属性能够在多线程中保持原子性。具体使用可见第三节。有如下的要求:只能修改对于其可见的字段;目标类的操作字段必须被volatile关键字修饰;目标类
2021-03-12 19:10:03 109
原创 AtomicInteger 源码解析(基于 JDK 1.8)
文章目录1 介绍2 初始化和 get/set3 原子操作1 介绍AtomicInteger 是一个原子类,增加和删除是原子性的,避免外界直接使用 Unsafe 来实现原子操作。实现原子性的原理是 CAS,具体可见我前面的文章。 unsafe 介绍(二)与CAS成员变量 value 是 volatile 的,保证可见性。Volatile 介绍public class AtomicInteger extends Number implements java.io.Serializable {
2021-03-10 08:53:02 158
原创 unsafe 介绍(二)与CAS
文章目录1 CAS 介绍1.1 定义1.2 ABA 问题2 Unsafe 中的CAS2.1 基本方法2.2 扩展方法2.3 解释在 Oracle JDK 8 中,找不到 unsafe.java,在 idea 中只能由 unsafe.class 反编译得到一个 unsafe.java。解压openjdk-8u41-src-b04-14_jan_2020.zip,查看 .\openjdk\jdk\src\share\classes\sun\misc\unsafe.java。这里我也将 unsafe.jav
2021-03-08 22:23:52 114
原创 Unsafe 介绍(一)
文章目录1 初始化2 获取unsafe3 get/put4 堆外内存4.1 分配4.2 赋值4.3 释放4.4 内存大小4.5 使用5 类/对象/数组5.1 对象5.2 类5.3 数组5.4 使用6 线程6.1 介绍6.2 使用7 内存屏障8 CAS9 其他10 unsafe 源码在 Oracle JDK 8 中,找不到 unsafe.java,在 idea 中只能由 unsafe.class 反编译得到一个 unsafe.java。解压openjdk-8u41-src-b04-14_jan_2020.
2021-03-05 16:32:50 475
原创 Volatile 介绍
文章目录1 介绍2 Java 内存模型 JMM3 特性3.1 可见性3.2 有序性3.3 不保证原子性本文主要参考 《Java并发编程的艺术》以及一些博客1 介绍如果一个变量用了volatile修饰,那么这个变量是对所有线程共享的、可见的,每次jvm都会读取最新写入的值并使其最新值在所有CPU可见。当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。2
2021-03-03 10:38:40 383 2
原创 LinkedHashMap 源码解析(基于 JDK 1.8)
文章目录1 主要属性2 构造器3 钩子函数的实现3.1 afterNodeAccess3.2 afterNodeRemoval3.3 afterNodeInsertion4 removeEldestEntry5 get6 put 相关6.1 putVal6.2 linkNodeLast7 remove8 迭代器源码环境: JDK 1.8LinkedHashMap 是 HashMap 的子类,在 HashMap 的基础上,对于每一个出现的节点 Node e,用双向链表来连接。可以理解为 LinkedHas
2021-02-24 15:50:16 156
原创 大数据书籍资源分享
文章目录1.城通网盘FlumeFlume构建高可用、可扩展的海量日志采集系统FlinkFlink编程指南HadoopHadoop实战-陆嘉恒(高清完整版)Hadoop权威指南_第四版_中文版Hadoop权威指南_第四版_英文原版Hadoop权威指南 中文版Hadoop基础教程Hadoop技术内幕:深入解析YARN架构设计与实现原理Hadoop 2.X HDFS源码剖析 带书签目录HiveHive编程指南Hive 简明教程HBaseHBase实战中文版HBase权威指南ZooKeeper从PAXOS到ZOO
2021-02-22 16:23:48 145
原创 HashMap 源码解析(基于 JDK 1.8)
文章目录1 常用变量及节点类2 构造器及 tableSizeFor3 put相关方法3.1 put/putIfAbsent/putAll3.2 putMapEntries3.3 hash3.4 putVal3.5 resize4 get 相关4.1 get/getOrDefault4.2 getNode5 remove 相关5.1 remove5.2 removeNode6 replace7 钩子函数8 键值对集合9 迭代器源码环境: JDK 1.8。本文不介绍红黑树节点的处理过程。在 1.8 中,H
2021-02-22 11:13:55 142 1
原创 LinkedList 源码解析(基于 JDK 1.8)
文章目录1 成员变量和 Node2 构造器3 预备方法3.1 linkFirst3.2 linkBefore3.3 unlink3.4 unlinkFirst3.5 其他4 add 相关4.1 add4.2 addAll4.3 offer5 remove6 get/set7 迭代器7.1 迭代器7.2 反向迭代器源码环境: JDK 1.8。关键的算法用 gif 图进行描述。如果大家对画图或者 gif 工具有建议,欢迎在评论区评论。1 成员变量和 Node链表节点是 Node,Node 包含 ite
2021-02-19 15:22:13 102
原创 ArrayList 源码解析(基于 JDK 1.8)
文章目录ArrayList 源码解析1 主要属性2 构造器3 add以及扩容3.1 add3.2 addAll3.3 扩容相关4 remove5 get/set6 迭代器6.1 迭代器6.2 列表迭代器ArrayList 源码解析源码环境: JDK 1.8首先介绍读源码的方法,有些构建的方法会将源码整体编译,造成卡顿,需要加大 Build process heap size。这里不将源码拷贝到src,具体见韩顺平的源码阅读配置视频:韩顺平源码视频,或者别人做的视频截图:自制截屏PPT看源码主要看属性
2021-02-17 21:20:42 86
原创 四个月大数据自学进大厂总结
1 个人情况介绍首先介绍一下基本情况,本科211非科班,硕士985计算机,参加21届秋招,拿到百度和美团offer。我从大三开始决定转计算机,先学Python,然后是Java SE,大四学了算法和数据结构以及机器学习。当时主要是看书和慕课视频,有很多不足。首先只是入门,没有深入学习,也没有做项目,导致印象不够深刻。其次是学习算法和数据结构只是看书,没有刷题,很多算法在找工作基本用不到(比如图的几个算法),不刷题就对它们的使用和变化理解不深。研究生2年,研一上半年做了一百道leetcode,下半年20
2021-02-11 20:04:52 873
原创 ZooKeeper面试题
1. ZooKeeper介绍1.ZooKeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,ZooKeeper就将负责通知已经在ZooKeeper上注册的那些观察者做出相应的反应。2. 特点1)ZooKeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。2)集群中只要有半数以上节点存活,ZooKeeper集群就能正常服务。3)全局数据一致:每个Server保
2021-02-11 14:11:50 322
原创 Spark面试题
1. Spark的三种部署模式1. Local模式:单机调试local:只启动一个线程local[k]:启动k个线程local[*]:启动cpu数目的线程2. 分布式(1)standalone模式:在架构上和MapReduce1具有一致性,资源抽象为粗粒度的slot,slot决定task。(2)Spark on yarn模式(☆)Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节
2021-02-11 14:03:39 517
原创 Kafka面试题
1. Kafka介绍Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。2. 消息队列的两种模式(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。(2)发布/订阅模式(一对
2021-02-11 13:49:56 461
原创 Hive面试题
1. 什么是HiveHive:由 Facebook 开源用于解决海量结构化日志的数据统计。Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。本质是:将 HQL 转化成 MapReduce 程序1)Hive 处理的数据存储在 HDFS2)Hive 分析数据底层的默认实现是 MapReduce3)执行程序运行在 Yarn 上2. Hive的架构原理(☆)1.用户接口:ClientCLI(hive shell)、JDBC/OD
2021-02-11 12:54:51 390
原创 HBase面试题
1. HBase数据模型(☆)1)Name Space命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase 有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase内置的表,default 表是用户默认使用的命名空间。2)Region类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBa
2021-02-11 12:49:48 218
原创 hadoop面试题
1. 集群的最主要瓶颈磁盘IO2. Hadoop运行模式包括单机模式、伪分布式模式、完全分布式模式。单机模式(standalone)单机模式是Hadoop的默认模式。这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置。在这种默认模式下所有3个XML文件均为空。当配置文件为空时,Hadoop会完全运行在本地。因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hado
2021-02-11 12:44:03 930
原创 flume面试题
1. 你是如何实现 Flume 数据传输的监控的使用第三方框架 Ganglia 实时监控 Flume。2. Flume 的 Source,Sink,Channel 的作用?你们 Source 是什么类型?1. 作用(1)Source 组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy(2)Channel 组件对采集
2021-02-11 12:38:04 370 3
memcached全面剖析.zip
2021-02-22
idea debug有问题
2021-01-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人