JVM知识点
JVM组织架构: 类加载器,负责加载Class文件,将二进制数据读到内存(方法区) 运行时数据区,为Java程序的运行分配空间并处理数据 执行引擎,将字节码翻译为当前机器的机器指令(执行字节码) 加载过程:类加载器读取 Class 文件的二进制数据后,会在内存中生成一个代表该类的java.lang.Class对象(这个对象存放在堆内存中),同时将类的元数据(方法、字段、常量池等)存储到方法区(逻辑概念)。 运行时数据区堆给所有的对象分配内存的地方,分为新生代和老年代,新生代又有:Eden区,From区, To区之分,大小比例8:1:1 新生代 -> 老年代长期存活,大对象,动态年龄判断动态年龄判断:当Survivor区的所有对象大小超过一定比例(一般是Survivor区的一半),那么没到达年龄阈值的对象也可能被提前晋升到老年代 随着JIT(Just In Time)的出现,“所有”不再这么绝对,会有逃逸分析来决定对象是否可以分配在栈上。 逃逸分析 1234567private static void createObject() { // 创建一个对...
volatile和synchronize
volatilevolatile 是一种轻量级的同步机制,用来保证变量的可见性与禁止指令重排,但不能保证原子性。适用于状态标志这类场景,不适用于复杂的共享数据更新。 用来解决多线程环境下变量的可见性问题和指令重排序问题。 实现原理:JVM在编译的时候加入内存屏障禁止指令重排序。对于被volatile修饰的变量,要从主内存去读取,写完会刷新到主内存中 应用场景:单一情况:boolean 状态标志DCL双端锁(单例模式)非原子性操作(volatile不保证原子性) 面试: 内存屏障:排序栅栏,禁止重排序粗分: 读屏障, 写屏障细分:读读,写写,读写,写读 synchronizedsynchronize是Java中的关键字,用来保证多个线程操作代码区活访问共享资源时的安全性。 可以修饰方法(实例方法或静态方法)和代码块。 synchronized的核心是通过“对象锁”实现的,底层依赖JVM的monitorenter和monitorexit,以及操作系统的互斥原语。 具体逻辑: 锁的载体:被synchronized修饰的代码必须关联一个锁对象(修饰实例对象时,锁对象时this;修饰...
线程池和Executor框架
在并发编程中,线程是一种宝贵的资源。合理地创建和管理线程,不仅能提升程序性能,还能避免系统资源被耗尽。线程池(Thread Pool) 正是为此而生的利器。 什么是线程池线程池可以理解为线程的容器或线程的管理者。它内部维护了一组可复用的线程,并通过合理调度来执行提交的任务,从而避免频繁创建和销毁线程的性能开销。线程池由三部分组成: 核心线程(core thread) 线程池中始终保留的线程数,即使空闲也不回收。 非核心线程(临时线程) 当任务太多且核心线程都在忙,线程池会创建非核心线程来帮忙。 一段时间(keepAliveTime)内空闲就会销毁。 任务队列(workQueue) 提交的任务如果所有线程都忙,就会被放入队列等待执行 为什么需要线程池?降低频繁的创建线程和销毁线程控制最大并发线程量 ThreadPoolExecutor 函数参数详解123456789101112131415161718192021public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int...
线程的六种状态
在 Java 中,每个线程都有它的“人生轨迹”,它会经历6 种状态,而这些状态会影响线程的运行、调度和资源占用情况。 Thread.State 规定 Java线程的六种状态: 12345678public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;} New12Thread t = new Thread(() -> {});// 还没 start(),状态为 NEW 线程被创建但还未启动,只有调用start()才会进入下一个状态 RUNNABLE(可运行)1234Thread t = new Thread(() -> { while (true) {} // 占用CPU});t.start(); // 进入 RUNNABLE 状态 线程可以运行,正在被调度或等待 CPU 时间片,不代表一定正在执行,只是“有资格执行”。 BLOCKED(阻塞)12...
多线程入门
从现在开始,我们进入并发编程的学习,那么首先我们要了解的就是多线程。 Java单线程程序已经能够完成逻辑处理,为什么还需要“多线程”呢? 单线程只能同时做一件事,无法同时进行多个任务。如果某个操作耗时较长,会引起主线程的阻塞,导致程序变慢。 单线程像是你在同一时间只能写作业,而有些人却能够边听歌,看综艺,还能写作业。 进程与线程?在操作系统中,我们常听到“进程”和“线程”这两个词,它们到底是什么?两者有什么区别?为什么需要多线程而不是直接使用多个进程? 概念 定义 进程 操作系统资源分配的基本单位。每个运行中的程序就是一个进程,拥有独立的内存空间和系统资源。 线程 进程中执行的最小单元,是CPU调度的基本单位。一个进程中可以包含多个线程,它们共享进程的资源。 简单来说,每个程序就是一个进程,一个进程可以拥有多个线程 Java 中创建多线程的常见方式继承Thread类 12345678class MyThread extends Thread { @Override public void run() { Sys...
Java基础知识点
感谢韩顺平老师的网课!韩顺平老师Java基础 基础知识字符串转对应的数据类型, 需要相应的方法Integer.parseIntDouble.parseDouble字符串转字符:取出字符串第一个字符:s.charAt(0) 算术运算符%: 取余的本质在于公式:a%b=a-a/b*b,因此即使是负数也是可以取余的。注意:当a为浮点型时,有一步要强转成整数进行计算,此时 a%b=a-(int)a/b*b &&:短路与 当第一个条件为假时,&&不会进行下一条件的判断,&会把下一条件判断完 因此常用&& swicth: switch(num),这个变量num的类型仅限于byte,short,int,rnum,char,string六种数据类型 写在case后的常量类型,要与num类型相同,或者,可以向num的数据类型兼容 若当前case满足条件且未设置break,则会忽略下面的case,穿透执行里面的语句,直至遇到下一个break。利用这个性质,可以设置多个case,满足其中一个case时,输出他们共同的输出语句。 可...
暑假学习感想
先介绍一下自身的情况,虽然是在一个双非学校就读数学系,但在这之前我已经修了专业课C语言,C++,python,数据结构了在去年寒假准备算法竞赛学了一些基础算法和数据结构,但比赛拉胯之后道心破碎了(我只是会背一些基础板子,唉,赛前做了一些dfs,bfs自我感觉还不错的),所以本学期的数据结构没听,后面三天速通88分,纯粹的背题考试机器罢了。在暑期到来之前,也是在我考完专业课后十天左右的假期的时候,在b站刷到了upjiangxiangchi的计算机学习路线这一视频,好像不能算是刷,我自己找的,因为马上就大三了,在一个双非学校且因为经济原因放弃考研的我突然意识到毕业即失业的我决定转码。虽然我7月5日就放假了,但我实实在在的假期却是7月20号开始的,中间被那个三下乡志愿折磨的劳心劳力。 中途折腾了个博客,就是你现在看到的这个,挺好玩的哈哈哈哈。看了《程序是怎样运行的》,前面九章我看得懂,大概对计组有了一点了解,后面三章我的知识就匮乏了··· 正文版本是最新的24summer,视频是b站21spring精译版因为之前学习过python,所以前面的学习并没有很困难,直到递归,这玩意在我之前学...
Cat
对于 prombel5 autocorrect中的要求:差异值相同时,输出列表靠前的单词,最开始以为自己灵机一动——倒序循环,一直更新(可以免去判断位置前后的判断),这样就可以取出最小最靠前的啦,于是便有了下面的代码: 12345678910111213141516res = 1000check = about2(word_list)if check(typed_word): return typed_wordelse: #从后往前免去一个判断——靠前输出 word_list.reverse() # 反转 for x in word_list: pre = res diff = diff_function(typed_word,x,limit) res = min(res,diff) if pre != res or diff - pre == 0: final = x if res <= limit: return final retu...
Ants
这一个项目整体比较简单,只要搞清楚这只蚂蚁的作用代码基本很容易写出来,再通过测试中跑出来的问题调整下细节加一些限制条件就OK了。吐槽一下这个项目有些函数的设计,他没有告诉你要什么效果,读完题目一脸懵逼,要去跑测试才知道自己要干嘛。。。 核心概念蚁巢:游戏发生的地方格子:一个格子放一只蚂蚁或者多只蜜蜂蜂巢:生产蜜蜂的地方蚂蚁和蜜蜂,类似植物大战僵尸 火蚁: 范围性反甲 死亡之焚(默认三点伤害)一些细节在于要把自身的位置先保存下来,后面蚂蚁寄了没办法通过自身去访问位置 12345678910111213def reduce_health(self, amount): # BEGIN Problem 5 place = self.place bees = place.bees[:] #非空说明还没死 Ant.reduce_health(self, amount) if self.place: #找位置上的蜜蜂 for b in bees: In...
Hog
按照课表的话,我的进度即将踏入第四周(hw03还没完成),现在才做完Hog,还是因为对这种作业项目还是有点害怕的,但这第一个项目也是很友好,有一点点基础的我只要读了文档要求基本都可以写出来。学到现在这个课程所带给我的震撼真的很大,怎样的夸赞都不为过,为了让你明白文档的要求,课程在问题的下面设置基于ok的选择或问答题帮助你理解。文档虽然是英语的,但只要看多了还是很容易熟悉这些术语的,主要的困难就是长难句不太符合中文的习惯,慢慢阅读和实时翻译是个好办法,翻译软件翻不懂直接复制给GPT解释,还是很好解决的。ok评分机制带给打怪升级的体验,类似Accept的爽点。 过程P1陷阱dice()如果传入的是文档中的测试函数,其作为一个表达式使用一次,他的值都会被改变 12345678910111213# 通过测试的score = 0have_one = Falsewhile num_rolls > 0: a = dice() score += a if a == 1: have_one = True num_rolls -= 1if have_one...