- 博客(29)
- 收藏
- 关注
原创 多线程(5)——单例模式,阻塞队列
在之前,都是按照单线程来编写代码,这个代码执行下来,第一次判定和第二次判定的结论是一定相同的,但是现在是多线程模式了,实际开发中,单例类的构造方法可能是一个非常重量的方法,如果多次触发这个bug,就会浪费好几分钟的时间(加载时间翻倍)2.值加载文件的一小部分,就立即给用户显示,随着用户的翻页操作,在加载对应部分数据(懒汉模式)等待消费者处理,直接扔给阻塞队列,消费者不找⽣产者要数据,⽽是直接从阻塞队列⾥取.因为队列最大容量只有2,如果再入队列,就会触发阻塞了,take() 同理。
2025-05-26 20:11:35
1180
原创 多线程(4)——线程安全,锁
在多线程编程中,线程不安全问题主要源于多个线程同时修改共享数据,且操作非原子性。线程调度的随机性、内存可见性问题和指令重排序是导致线程不安全的根本原因。为了解决这些问题,Java提供了synchronized关键字,通过加锁机制确保操作的原子性,避免多个线程同时修改同一变量。此外,死锁是多线程编程中的常见问题,通常由多个线程相互等待对方持有的锁引起。为避免死锁,可以通过规定加锁顺序或避免在持有锁的情况下申请新锁来打破死锁的四个必要条件。理解并应用这些机制,可以有效提升多线程程序的稳定性和性能。
2025-05-17 11:48:05
785
原创 多线程(3)——线程的状态
线程的状态是一个枚举类型enum,用Thread.State 表示。操作系统中的线程,生命周期和 Thread 对象不完全一致。
2025-05-13 10:00:00
253
原创 多线程(2)——Thread类及常见方法
本文介绍了Java中线程的构造方法、常见属性、启动、中断和等待操作。通过Thread(String name)可以为线程命名,便于调试。常见属性包括线程ID、名称、状态、优先级等。线程分为前台线程和后台线程,前台线程会阻止进程结束,而后台线程则不会。启动线程使用start()方法,中断线程可以通过变量控制或使用isInterrupted()方法。等待线程使用join()方法,可以确保线程按顺序执行。这些操作帮助开发者更好地管理和控制多线程程序的执行。
2025-05-12 21:31:35
626
原创 多线程(1)——认识线程
在介绍多线程前,先介绍一下操作系统的概念操作系统是一个管理的软件1.对下管理各种硬件设备2.对上给软件提供稳定的运行环境。
2025-04-26 23:23:33
905
原创 MySQL_数据库约束
数据库约束就是对数据库添加一些规则,使数据更准确,关联性更强比如加了唯一值约束,就避免了人工检查的成本,大大降低了时间成本和风险。
2025-04-15 21:11:15
964
原创 数据结构-哈希表
为了避免这样的情况,Java的 HashMap 会在元素往链表上插入的时候做一个判定,判定如果当前链表的长度达到了一定的值了,直接把链表转成红黑树(增加效率)把一大串数据,通过一系列数学变换,映射到一个较小的数组中,比如把一亿的数据保存到数组int [ ] count=new int[10000]中,如果要存储的是任意整数,范围是42亿个,但是创建的保存数据的数组范围是10000个,此时必然会出现重复,方法:数组的每一个元素都是“链表节点”,在有冲突的位置使用一个链表,保存“冲突”的元素。
2025-04-12 10:59:30
887
原创 二叉搜索树,Set和Map
和Set类似,Map更进一步,Set上面保存的只是“键”(key),Map上面保存的是“键值对”(key-value)与List不同,List(有序的)中的{1,2,3}和{1,3,2}是不同的,而Set(无序的)中这两个组合是相同的。,该内部类中主要提供了<key, value>的获取,value的设置以及Key的⽐较⽅式。如果查找的值比该节点的值大,往右子树找,如果比该节点值小,往左子树找,想通就找到了。的容器或者数据结构,其搜索的效率与其具体的实例化⼦类有关。通过查找的方式,找到新元素所在的位置。
2025-04-11 10:00:00
1867
原创 各种排序思路及实现
循环往复,直到待排序区间为0设父节点下标为 i ,左子树下标2i +1,右子树下标2i+2因为堆的父子下标关系有一个前提,根节点下标是0,所以前半部分不能是已排序区间。
2025-04-08 21:26:08
1174
1
原创 优先级队列_堆
Java集合框架提供了两种优先级队列PriorityQueue和PriorityBlockingQueue,PriorityQueue是线程不安全的,后者是线程安全的。2.向下调整,则是指 找出子树中最小值,和根节点比较,若根节点大就交换,持续往下进行,直到根节点比子树小,或没有子树时。先把新元素进行尾差,然后向上调整(从最后的飞叶子节点开始调整成小堆,然后一次往上走,直到标记的child下标小于0)队列是一种先入先出的数据结构,优先级队列又特殊一点,优先级队列出队列时,是先对优先级高的元素出队列。
2025-04-06 12:18:22
715
原创 模拟实现ArrayList顺序表
两者的时间复杂度都为O(1) , 其他操作为O(N)创建顺序表的时候, 会先申请一块空间。顺序表是基于数组实现。
2025-01-21 15:51:45
595
原创 Java数据结构__Arraylist与顺序表
ArrayList是以泛型⽅式实现的,使⽤时必须要先实例化ArrayList实现了RandomAccess接⼝,表明ArrayList⽀持随机访问ArrayList实现了Cloneable接⼝,表明ArrayList是可以clone的ArrayList实现了Serializable接⼝,表明ArrayList是⽀持序列化的和Vector不同,ArrayList不是线程安全的,在单线程下可以使⽤,在多线程中可以选择Vector或者。
2025-01-18 14:36:32
923
原创 JavaSE练习--图书管理系统(控制台版本)
各种操作放在operatin包中 , 用户分类放在user包中 , 每个书的信息存在Book类中 , 一系列书放于BookList类中< 1 > 首先通过IOperation接口创建一个work方法(用于统一各种Operation方法名)< 2 >通过抽象类User实现管理员(AdminUser)和普通用户(NormalUser)的多态 , 分别实现两种不同的菜单操作,实现不同的operations数组操作< 3 > 用Main方法选择调用不同的身份,启动程序。
2025-01-02 10:00:00
1030
3
原创 JavaSE_String类(2)
根据之前所学知道, 字符串中用"=="是比较两字符的位置是否一样//false//true利用intern , 把"hello"字符串放进常量池中,此时s2就指向常量池的对象,结果为真。
2024-12-29 10:43:35
721
原创 JavaSE_String类(1)
与equals不同的是, equals返回值类型是boolean , compareTo返回的是int类型.从前往后找 , 返回String字符串第一次出现的下标 , 没找到返回-1。从formIndex往前找字符char出现位置的下标 , 没找到返回-1。从后往前找 , 返回字符char第一次出现位置的下标 , 没有返回-1。< 1 > 先从首字符开始,按照字典次序大小比较 , 如果。比较的是字符串的地址 , 要想比较内容是否相等 , 就用。返回字符char第一次出现的位置 , 没找到返回-1。
2024-12-11 22:10:52
1003
原创 JavaSE_继承和多态(2)
5.重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致。
2024-12-08 21:47:00
276
原创 C语言习题_反向存放数组元素(不含元素个数)
( 2 ) 因为不确定输入几个元素 , 我们就从其他方法入手 , 比如当要结束输出的时候 , 会输入换行符 , 利用这个特性写入代码 , 当碰到 ’ \ n ’ 时 , 结束循环输入。( 3 ) 其次是输入的值存入数组中 , 假设要存的值为num , 假设count为初始下标0 , 每次循环条件成立就把num值存入, 再让count自增1 , 就能成功存入了。此处可发现, 输入实例是不带n ( 即你要输入几个元素 ) 的 , 让原本简单的题目增加了一点难度 , 下面上题解。
2024-12-06 00:55:24
227
原创 C语言_指针 ( 1 )
在C语言中 , 创建变量就相当于在内存中开辟了一块空间 , 而每个空间(相当于一个小房间) 存贮这个变量值 , 而这块空间也有单独的名字,这个名字就是地址 , 取地址操作符 & 就是把这个房间名字取出来 , 即。像这样写也是可以的, 类似于变量的初始化和赋值, 已定义pc的为char* 类型的数, 之后pc就默认表示为一个指针类型的数据 , 再让pc指向c的地址 , 但是要。就是p的类型,存入int型变量的地址,同理char类型的变量,存它的地址的类型为char。解引用*pa得到的就是a的值 ,
2024-12-02 10:40:45
1174
原创 JavaSE_类和对象
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。即this引用的是调用成员方法的对象因此,this.name指向的是最开始定义的成员变量对上述代码改动如下int age;cat.meow("小白",4);System.out.println("猫的名字是"+cat.name+".猫的年龄是"+cat.age);构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且。
2024-11-27 21:25:01
1061
3
原创 C语言_自定义函数
其中,type(类型)可为int,double,void等类型,函数名是可以自己定义(随便取)的1上述自定义函数的返回值是x和y的和,在main函数中输出则为5其中main函数中的自定义函数()中调用的为实参,把这个实参分别传给自定义函数的x,y.其中,形参是实参的一份临时拷贝 , 也就是说 ,,例如如图 , 形参a的改变和main函数被调用的值无关 , return语句返回的值是在add函数这个范围里的 , 与主函数的a无关,如果想让a值为0 , 代码应该这样修改。
2024-11-16 22:51:20
1203
原创 初识c语言及数据类型
这篇文章主要是对c语言前面两章易错点总结和补充,主要介绍:1.输出函数puts2.单(双,三)目运算符的定义3.数据类型(int float等)4.数据转换例题
2024-11-01 18:58:50
843
原创 C语言——函数递归
虽然函数递归看起来很简洁,但是在一些题目中不适用,可能会出现多次重复计算的情况(斐波那契数计算),所以在做题时要多观察,多练手。发现后面的阶乘有每次都减一的规律,当阶乘变为0的时候(0的阶乘为0),停止计算,从中可以发现递归的结构,用c语言来实现。递归分为递推和回归,即先递推再回归,当碰到递归时后面的式子暂时先不算,当递推到最后一次时开始回归并计算后面的式子。,以此类推,直到最后乘到n(k==1),停止递推,是k在逐渐趋近于1,以下为思路。(1)递归存在限制条件,当满足这个限制条件的时候,递归便不在继续。
2024-10-28 20:19:36
326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人