笔记
文章平均质量分 72
大龄毕业生
大龄毕业生学习中
展开
-
虚拟机类加载机制-0804
虚拟机类加载机制概念:把类的数据从class文件加载到内存,对数据进行校验、转换、解析和初始化,最终形成可以直接被虚拟机使用的java类型。java可以动态拓展的特性就是依赖运行期间动态加载和动态连结的特点类加载时机类从加载到内存到卸载出内存,生命周期:加载->连接(验证>准备->解析)->初始化->使用->卸载加载通过一个类全限定名来获取这个类的二进制字节流将字节流代表的静态存储结构转换为运行时数据结构在内存中生成一个class对象,作为访问这个类的原创 2021-08-04 23:20:18 · 108 阅读 · 0 评论 -
垃圾收集器与内存分配策略-学习笔记2
程序计数器、虚拟机栈、本地方法栈三个区域都是随着线程而生,随线程而死。栈中的栈帧随着方法的进入和退出执行进入出去的操作,每一个栈帧分配多少内存在类结构确定下来的时就基本确定了,因此,这些区域不太考虑垃圾回收的问题。因为方法结束或者线程结束,内存自动就回收了java堆和方法区不同,一个接口中多个实现类所需的内存可能不一样,我们只有在程序运行期间才知道创建那些对象。内存分配是动态的就需要关注垃圾回收引用计数法public class ReferenceCountingGC { public O原创 2020-11-22 20:57:42 · 87 阅读 · 0 评论 -
深入理解JAVA虚拟机-学习笔记(java内存区域)
程序计数器Program Counter Register:是一个较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。(分支、循环、异常等功能都需要这个计数器来完成)。java虚拟机的多线程都是通过线程轮流切换并分配处理执行时间的方式来实现的(时间片),在任何一个时刻,一个处理器只能执行一条线程中的指令。因此。为了线程切换后可以恢复到正确的位置(上下文切换),每条线程都需要一个独立的程序计数器,独立存储。称为“线程.原创 2020-11-19 00:12:22 · 96 阅读 · 0 评论 -
线程池基本概念
线程池的处理流程如果当前运行的线程小于corePOOLSize,则创建线程执行任务(需要获取全局锁)运行的线程多余等于corePoolSize,将任务加入BlockingQueue。如果无法加入BlockingQueue(队列已满),则创建新的线程来处理任务。如果创建新的线程使得当前运行的线程超出maximumPoolSize,任务将被拒绝。...原创 2020-11-12 23:34:48 · 116 阅读 · 0 评论 -
可重入锁、读写锁
ReentrantLock:重入锁。表示该锁能够支持一个线程对资源的重复加锁.任意线程在获取到锁之后能够再次获取该所而不会被锁阻塞。之前写的Mutex是一个不支持的重入的独占锁。实现可重入线程再次加锁:锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次获取。锁的最终释放:线程重复N此获取了锁,随后在第N次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数增加,计数表示当前锁被重复获取的次数,而被锁释放的时候,计数自减,当计数等于0的时候表示锁已经成功释放。 f原创 2020-11-11 22:52:39 · 389 阅读 · 1 评论 -
AQS队列同步器的实现分析-共享锁
共享式同步状态的获取与 释放共享式获取与独占式的区别在于同一时刻能否有多个线程同时获取到同步状态。写操作要求对资源的独占式访问。读操作可以是共享式访问。左边:共享式访问资源,其他共享式访问都被允许,而独占式被阻塞右边:独占式。同一时刻,其他访问都被阻塞。 public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared(arg);原创 2020-11-10 23:06:52 · 110 阅读 · 0 评论 -
AQS队列同步器的实现分析-独占锁
同步队列:感觉全部都是特别重要的,就都加粗了。排版不好看。尴尬同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态时失败时,同步器会将当前线程和等待信息构造成一个NODE节点并将其放入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。可以看到:同步器包含:一个指向头结点的引用,一个指向尾节点的引用。为了保证获取同步状态失败的线程加入队列线程安全,用了CAS的方法这是尾节点。首节点是获取同步状态成功的节点。首节点原创 2020-11-10 00:07:01 · 84 阅读 · 0 评论 -
锁-独占锁、同步队列器
Lock接口锁是用来控制多个线程访问共享资源的方式。一个锁可以防止多个线程同时访问共享资源(读写锁,允许多个线程并发的访问共享资源) public static void main(String[] args) { Lock lock = new ReentrantLock(); lock.lock(); try { } finally { lock.unlock(); } }这是锁的原创 2020-11-08 22:26:59 · 120 阅读 · 0 评论 -
终于到线程池了
public interface ThreadPool<Job extends Runnable> { //执行一个job这个job需要实现runnable void execute(Job job); //关闭线程池 void shutdown(); //增加工作者线程 void addWorkers(int num); //减少工作者线程 void deleteWorkers(int num); //获取正在等待原创 2020-11-08 14:00:41 · 79 阅读 · 0 评论 -
线程间通信-java并发编程的艺术
volatile synchroizedjava支持多个多个线程同时访问一个对象或者对象的成员变量,由于每个线程都可以拥有这个变量的拷贝,这样的目的在于加速程序的执行。所以,一个线程看到的变量的并不一定就是最新的。volatile可以修饰字段(成员变量),就是告知程序任何对该变量的访问都需要从共享内存中获取,对他的改变必须同步刷新到共享内存(主内存),保证所有线程对这个变量的可见性。synchorized可以修饰方法或者修饰代码块,主要就是确保多个线程在同一时刻,只能有一个线程处于方法或者代码块中,原创 2020-11-08 01:08:26 · 147 阅读 · 0 评论 -
java并发编程的艺术-安全的终止线程
传统的suspend()方法,在调用后,线程不会释放已经战友的资源比如锁之类的,而是占着资源休眠,这样容易死锁。stop方法在终结一个线程的时候不会保证线程的资源正确释放,通常是没有给予线程完成资源释放的机会,因此,程序可能存在不确定。中断就是一个合适的取消或者停止任务的方法。除了中断,还可以利用boolean变量来控制是否需要停止任务并终止该线程。public class ShutDown { public static void main(String[] args) throws In原创 2020-11-07 22:07:35 · 98 阅读 · 0 评论 -
java并发编程的艺术-java并发编程基础
线程:操作系统的最小调度单位(轻量级进程)。在一个进程中可以有多个线程,这些线程都拥有自己的计数器、堆栈、局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,使得我们觉得是同时执行的。调度线程:操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待着下一次分配。线程优先级就是决定线程或多或少分配一些处理器资源的线程属性。public class Priority { private static volatile boolean no原创 2020-11-07 21:24:06 · 161 阅读 · 0 评论 -
java初始化一个类的处理过程
第一阶段通过在Class对象上同步(即获取class对象上的锁),来控制类或者接口的初始化,这个获取锁的线程会一直等待,知道当前线程获取到这个初始化锁。假设Class对象当前没有被初始化,(初始状态为state,标记state =noInitialzation),且有两个线程AB同时试图初始化这个对象第二阶段线程A执行类的初始化,同时B在初始化锁的condition上等待第三阶段,A设置state=initialized,然后唤醒在condition中等待的所有线程B结束类的初始化处理.原创 2020-11-07 15:27:40 · 160 阅读 · 0 评论 -
java并发编程的艺术--锁的内存语义、双重检查锁定
由于volatile仅仅保证单个volatile变量的读/写变量读/写具有原子性,而锁的互斥性的特性可以确保对转增个临界区代码的执行具有原子性。 int a = 0; public synchronized void writer() { //1 a++;//2 } //3 public synchronized void reader() { //4 int i = a; //5 //.... } //6根据程原创 2020-11-07 00:21:22 · 120 阅读 · 0 评论 -
volatile内存语义的实现
为了实现volatile的内存语义,编译器在生成字节码时,会把指令序列中插入内存屏障来禁止特定类型的处理器重排序。下面是基于保守策略的JMM内存屏障插入策略在每个volatile写操作前面插入一个StoreStore屏障在每个Volatile写操作后面插进入一个StoreLoad屏障在每个volatile读操作的后面插入一个LoadLoad屏障在每个volatile读操作的后面插入LoadStore屏障...原创 2020-11-06 23:13:13 · 166 阅读 · 0 评论 -
java并发编程的艺术-volatile的内存语义
//使用volatile声明64位的long变量 volatile long v1 = 0L; //单个volatile的写 public void set(long l) { v1 = 1; } //多个volatile的读写 public void getAndIncrement() { v1++; } //单个volatile的读 public long get() { r..原创 2020-11-06 00:09:57 · 205 阅读 · 5 评论 -
java并发编程的艺术-Java内存模型
线程之间的通信机制:共享内存和消息传递在共享内存的并发模型中,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型中,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。JAVA采用共享内存的并发模型java中,所有实例域、静态域、数组元素都存储在堆内存中,堆内存在线程之间共享。java线程之间的通信又java内存模型(JMM)控制,JMM决定了一个线程对共享变量的写入何时对另一个线程可见。线程之间的共享变量存储在主内存中,每个线程都有一个私有的原创 2020-11-04 23:39:45 · 136 阅读 · 0 评论 -
star_snnu人员存储
今天完成了人员管理系统,实现了简单的人员增删改查。其中对于热点人员(教师)的信息进行了redis缓存。这里还没有对数据库加唯一索引,也没有写参数校验的代码。后面补全。用神器knife4j进行接口测试 @Override public void insertUser(InsertUserBizRequest bizRequest) { User user = new User(); user.setUserId(UUIDUtils.getUUID());原创 2020-10-24 23:43:24 · 110 阅读 · 0 评论 -
剑指offer01-- 找出数组中重复的数字 五种解法
/** * 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 * <p> * 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 */publ.原创 2020-10-18 22:04:40 · 99 阅读 · 0 评论 -
Cannot autogenerate id of type java.lang.Integer for entity 记录mongodb 插入数据的一次错误
本身想在mongo中添加一个实体数据 @Autowired private MongoTemplate mongoTemplate; public void insert(CompanyEntity entity) { mongoTemplate.save(entity); } 实体定义public class CompanyEntity { private Integer id; }这里因为自己定义的实体属性有id,和mon原创 2020-10-18 00:22:54 · 1357 阅读 · 0 评论 -
神器:Knife4j ,太方便了,大爱。代替postman
在用postman做接口测试的时候,如果字段比较多,且对象比较多的时候,参数的填写就很耽误时间,Knife4j一切都为你自动生成,你只需要填写参数值就好了。简直不要太方便。<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> &l原创 2020-10-15 23:55:57 · 2498 阅读 · 1 评论 -
Completed shut down of DiscoveryClient Eureka踩坑
启动项目发现没有注册到eureka。在pom中添加。并reload<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>完美解决问题...原创 2020-10-10 22:29:17 · 126 阅读 · 0 评论 -
环路检测,倒数第K个节点、整数反转-leetcode学习
给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。 public Node detectCycle(Node head){ Set<Node> set = new HashSet<>(); Node fast = head; while (fast!=null){ if (set.contains(f原创 2020-10-06 22:08:29 · 84 阅读 · 0 评论 -
学习Map的遍历方式
public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("zhang1", 2); map.put("zhang2", 4); map.put("zhang3", 7); map.put("zhang4", 33); map.put("zhang5", 6...原创 2020-10-04 22:10:01 · 84 阅读 · 0 评论 -
学习快慢指针
链表是通过指针,将一组零散的内存块串起来,不需要连续的内存地址,链表中得每个节点,都保存里下一个节点的内存地址的指针。单链表—>|data|next|—>|data|next|—>|data|next|—>null每个节点存在一个next节点,成为后续指针,next指针指向后一个节点,尾节点的next指针,指向null单向循环链表:尾节点的next节点,指向头结点双链表:在单链表的基础上,为每个节点增加一个pre节点,指向节点的前驱结点—>|data|nex.原创 2020-09-26 23:33:04 · 112 阅读 · 0 评论 -
java赋值问题
#mermaid-svg-eCdDTJNANHuRdsLa .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-eCdDTJNANHuRdsLa .label text{fill:#333}#mermaid-svg-eCdDTJNANHuRdsLa .node rect,#mermaid-svg-eCdDTJNANH原创 2020-09-22 23:47:13 · 267 阅读 · 0 评论 -
lamda经典案例-交易员、交易额、交易地
public static void main(String[] args) { Trader raoul = new Trader("Raoul", "Cambridge"); Trader mario = new Trader("Mario", "Milan"); Trader alan = new Trader("Alan", "Cambridge"); Trader brian = new Trader("Brian", "C...原创 2020-09-15 00:03:16 · 173 阅读 · 0 评论 -
lamda先用起来在熟悉原理
public class Dish { private final String name; private final boolean vegetarian; private final int calories; private final Type type; public Dish(String name, boolean vegetarian, int calories, Type type) { this.name = name;原创 2020-09-13 23:15:02 · 85 阅读 · 0 评论 -
学习string以及常用方法
String对象是不可变的,每一个看起来修改String的方法,起始都是创建了一个全新的String对象,以包含修改后的字符串内容,而最初的String对象丝毫未变。public class Immutabe { public static String upcase(String s){ return s.toUpperCase(); } public static void main(String args[]){ String q="howd原创 2020-09-12 17:09:28 · 214 阅读 · 0 评论 -
学习事务
事务的特性:原子性:事务是有一个或者多个活动组成的一个工作单元。原子性确保事务中所有的操作全部发生或者全部不发生(要么失败回滚、要么成功)一致性:一旦事务完成(不论成功还是失败),系统必须保证业务处于一致。现实的数据不应该修改隔离性:事务允许多个用户对相同的数据进行操作,每个用户的操作不会与其他用户纠缠在一起。因此,事务应该被彼此隔离,避免发生同步读写相同的数据持久性:一旦事务完成,事务的结果应该被持久化 <!--JDBC事务--> <bean id="transa原创 2020-09-09 21:16:43 · 167 阅读 · 0 评论 -
学习面向切面
横切关注点:分布于应用中多处的功能面向切面编程(aop)多要解决:将这些横切关注点与业务逻辑相分离横切关注点可以被模块化为特殊的类,这些类被称为切面。这样做有两个好处:首先,每个关注点现在只集中于一处,而不是分散在多处代码中。其次,服务模块更简洁,因为他们只包含关注点的代码。通知:切面的工作被称为通知连接点:连接点就是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为切点:切点的定义会匹配原创 2020-09-09 20:29:33 · 101 阅读 · 0 评论 -
初学 Bean
Bean的作用域:所有的Spring Bean默认都是单例。当在<**bean>**配置时,我们可以声明一个bean的作用域。比如,为了让我们每次请求你时都为Bean产生一个新的实例,我们只需要配置bean的Scope的属性为prototype。作用域定义singleton在每一个Spring容器中,一个Bean只有一个对象实例(默认)prototye允许Bean的定义可以被实例化任意次(每次调用都创建一个实例)request在一次Http请求中,每个B原创 2020-09-08 23:36:11 · 134 阅读 · 0 评论 -
学习-Bean的生命周期、springmvc执行流程
Spring对bean进行实例化Spring将值和bean的引用引入注入进bean对应的属性中如果bean实现了beanNameAware接,Spring将bean的ID传递给set-BeanName()接口方法如果bean实现了BeanFactorAware接口,Spring将调用setBeanFactory(),将beanFactory容器实例传入如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContetxt,将应用上下文..原创 2020-09-08 00:31:46 · 209 阅读 · 0 评论 -
Filed “xxx“ doesn‘t have a default value
filed “xxx” doesn’t have a default value。请查看你用到的sql。很可能就是代码字段和数据库字段不对应的原因论一次同事修改字段引发的问题原创 2020-09-05 16:47:10 · 450 阅读 · 0 评论