- 博客(24)
- 收藏
- 关注
原创 阻塞队列的理解
当你如果是if的时候当一个线程获得锁过后然后若在入队列时队列已经满了那么它就会进行阻塞同时会释放锁那么另一个线程就会获得锁然后再释放锁,那么此时在出队列时就可能notify会换新第一个线程中的wait然后它继续向后走那么此时的队列已将满了但是它的后面还有一个notify的就可能会唤醒另一个线程中的wait那么队列早已经满了那么就会造成数据丢失。当队列为满的时候,需要入队列的时候,需要等到其他线程出队列才可以。特点:当队列为空的时候,需要出队列的时候,需要等到其他线程入队列才可以。实现队列,初始时队列为空(
2025-07-17 09:37:05
921
原创 单例模式(饿汉模式,懒汉模式)
系统可能有时候想到优化就会将这个顺序变成132但是也不会影响整个结果的改变但是这里若变成132的话当第一个线程去访问的时候在这个132的顺序下正好将3走完(此时的引用不是null是一个尚未初始化的对象而已)此时线程被调度走了就开始让第二个线程重新开始那么它此时就会读到这个3的引用然后就会直接访回结果那么此时数据就错误。假设有两个线程,第一个线程先去访问的时候同样第二个线程也可能会访问那么此时他们就会创建两个实例那么就出现了线程安全问题。那么这样就使得当多个线程访问的时候就只有一个实例变量。
2025-07-09 14:55:38
395
原创 wait的理解
当有三个线程的时候,我们拥有了锁对象我们使用sleep函数对第二个线程让第一个线程先获取锁对象那么此时当我们使用wait的时候(用锁对象来调用)那么现在它马上就会释放锁进入阻塞等待第二个线程就会马上得到这个锁对象,在使用这个锁对象去调用notify的函数那么就会解除第一个线程中的阻塞等待就可以与其他线程再次进行竞争锁对象。首先wait的内部中的特征1.它可以自动的释放锁2.让线程进入阻塞等待3.当其他线程调用notify的时wait解除阻塞并与其他的线程一起竞争锁。
2025-07-07 15:39:57
657
原创 线程安全问题
就比如五个人吃饭桌子上有一碗面但只有五只筷子分别编号为1,2,3,4,5分别散落在每一个的两边(每一个人的左右两边都只有一只筷子)那么要吃这个饭必须一个人有两双筷子要么一个人拿着两双筷子吃其他的人就只有等待(堵塞等待)如果每个人都只拿两边最小的一个筷子那么则每一个人都只会拿一只筷子最终导致死锁。可重入锁指的是当在一个线程中锁的对象是同一个的时候当一个锁过后第二个锁持有第一个锁的钥匙当运行到第二个锁的时候它一看是它拥有这个锁那么就会继续加锁。在写的时候,volatile 关键字会直接会强制把最新值立刻刷回。
2025-07-03 16:09:52
431
原创 Thread的类
那为什么一定是要捕获的是final的呢?因为isQuit它被创在main方法线程的栈中,Thread被创建到另一个线程的栈中它们结束的时间是不同的因此有可能isQuit早已经被销毁此时Thread还想使用isQuit时已经找不到了那么此时它就会在自己的栈中创建一个新的isQuit那么这样就导致了两个值不同因此才必须是final。答案:当然是不可以的 虽然lambda和内部类可以进行变量捕获(访问外部的局部变量)但是这个变量必须是final的但是isQuit是要被修改的因此不可以是局部变量。
2025-06-16 17:37:47
481
原创 进程和线程的区别
进程和线程是操作系统中实现并发编程的核心概念。进程提供了资源隔离和保护的机制,而线程则在进程内部实现了轻量级的并行执行,降低了调度和通信开销。在实际应用中,可根据任务需求选择使用进程或线程:需要强隔离性的任务适合用进程,而需要高效共享资源和高并发的任务适合用线程。二者的结合使用,能够更好地发挥操作系统的性能优势。
2025-06-16 16:59:03
418
原创 MySQL的索引和事务
就是将一系列SQL语句装在一起然后一起去执行。像这样子若在减少的时候出现错误那么就会开启回滚让它的数据恢复过来(它就没有减两百元)让人感觉它是没有执行的其实它早已执行完毕当开启事务时它是还没有将这些SQL语句装在一起没有体现它的第一大特点。
2025-05-25 19:31:43
1819
原创 MySQL的查询进阶
select count(*)from 表名;它是用来统计个数的select sum(列名)from 表名;它使用来算一个整合的其他的都类似使用即可它是进行分组查询,且select字段必须是“分组依据字段”,若不是的则要用聚合函数才可以。select 列名1,列名2 from 表名 group by 列名1;如果是这样的话那么就会报错因为列名2它不是分组依据的字段因此要写成select 列名1,sum(列名2) from 表名 group by 列名1;若是求和就这样不是的话换成其他的聚合函数即可。
2025-05-25 17:22:22
522
原创 MySQL中简单的操作
select 1, 2,3+4+5 as 别名 from 表名;这个limit是指查询的总共页数而offset是指从0开始的几页(这里是使用下表索引值查询)若没有三页也无所谓。select 1,2, 3+4+5 from 表名;select 列名 from 表名 order by desc或者是asc(这个是默认值);select 列名,列名...from 表名;select * from 表名 where id=2 or id=3;select * from 表名 where id= 2;
2025-05-25 15:39:01
682
原创 排序的理解
就是先将第一个值保存起来,然后这个数据左右还分别是left,right然后先让right先动找到比第一个值小的值然后将它放到第一个值的下标,然后再移动left找到后将它放在right的下标,最终right与left会相遇此时就将已将保存好的值给他赋值到left下标或者right下标这样就找到了基准。在给定的数据中将下标为i的值与它前面所有的数字进行比较,将下标为i的值创建一个空间为tmp那么让它跟我的下标为i-1的值进行比较一直到i=0。若果说tmp的值比它小就将tmp下标的值赋值给比它大的值。
2025-04-26 18:56:58
1570
原创 二叉树的简单理解
层序遍历:设二叉树的根节点所在 层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。2.有一个完全二叉树如果说它的结点为奇数那么它度为一的结点则为0,若为偶数那么它度为一的结点则为1。双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点。孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点。根结点:一棵树中,没有双亲结点的结点。
2025-04-07 19:32:45
445
原创 链表的理解
存储上来看:顺序表是一个内存地址连续不断的相当于一个动态的数组,而链表呢在逻辑上看着是一个连续不断的但是实际上并不是的。用法上来看:顺序表适用于需要频繁随机访问元素,而插入和删除操作主要在尾部进行的场景。链表适用于需要频繁进行插入和删除操作,而随机访问操作较少的场景。
2025-03-30 15:39:29
1021
原创 链表的部分题型总结(无头单向非循环链表)
思路:先让fast先走k-1这样你把fast所指向的节点此时想成最后一个节点那么它就相当于倒数第k个节点此时你让slow和fast都只走一步一直保持这个距离最后让fast走到最后则就找到了slow的位置。思路:先创建一个新的空节点叫newHead,再将两链表进行第一次比较将小的值的nest放在newHead的nest,然后利用th=th.nest它的作用就是能够来连接两个链表比较大小后来连接它们。思路:利用快慢指针fast永远是slow的两倍那么当fast到达最后位置时slow是在中间节点。
2025-03-29 18:34:12
632
原创 ArrayList与顺序表
什么是线性表呢?相当于一个数组只有第一个元素没有前序,最后一个元素没有后继,且其它的元素有且仅有一个前序和后继。常见的线性表:顺序表、链表、栈、队列...顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成 数据的增删查改。在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:【说明】1. ArrayList是以泛型方式实现的,使用时必须要先实例化2. ArrayList实现了RandomAccess接口,表明ArrayList支
2025-03-20 16:39:41
943
原创 包装类&简单认识泛型
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。。此时这个为自动装箱这个为显示装箱这个为自动拆箱这个为显示拆箱。
2025-03-17 19:29:05
665
原创 异常的理解
像这样创建一个新的类然后让它继承具体方式: 1. 自定义异常类,然后继承自Exception 或者 RunTimeException2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因。
2025-03-13 19:50:01
1959
原创 String类
(在 Java 中,数据类型分为基本数据类型(如intchar等)和引用数据类型。基本数据类型的变量直接存储具体的值,而引用数据类型的变量存储的是对象在内存中的,并非对象本身。String属于引用类型,这意味着String类型的变量实际上存储的是,而不是字符串的具体内容。测字符串长度时要用lenth();测字符串是否为空要用isEmpty();注意:(在字符串为null时是不能使用isEmpt因为isEmpty是指向这个字符串的长度是否为空而null是指向的地址都没有对象都没有的)
2025-03-13 17:01:03
969
原创 Clonable 接口和深拷贝
这个为clone的方法的源代码我们可知道它的访问权限是protected,这个访问权限是在不同包且要为子类的情况下因此这里我们重写clone。那么我们要拷贝m里面那个因此我们应该用this.m.clone()来拷贝注意这里的this是指那个要来调用clone的那个就是this。它是个空的目的就是为了来给你证明当前类是可以被克隆的因此当我们完成以上的步骤那么我们就可以浅拷贝了。因为你重写时的返回值为Object类为父类因此我们需要向下转型才可以。还是会出错是为什么呢?但是它还是是会报错那是为什么呢?
2025-03-12 16:23:29
609
原创 内部类的理解
2.类加载的时候是不会加载成员的,而static是在类加载的时候创建的所以不可以的。匿名内部类相当于这类实现了一个接口A并且重写了其中的方法。以下是调用它的两种方法。3.当外部类数据的成员与内部类数据的成员一样的时候该如何访问外部类的成员呢?内部类包含三个分别是实例内部类,静态内部类,匿名内部类。2.这个类中能否有static修饰的成员变量和属性?1.获取实例内部类对象的时候需要依赖于外部类对象。3.用外部类的类名.this.成员变量的。1.如何创建实例内部类的对象呢?
2025-03-12 13:39:48
197
原创 JAVA的类和对象
这就是它的形式就是构建一个方法其中的方法名为类名其中它是没有返回值的4.2怎么调用的?其实它是通过在创建实例化对象的时候创建的这个构造方法如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。如果你有传入参数进去那么你就必须在对应的类中创建构造方法注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间(只是给内存分配空间)。使用this()也可以进行传参但是在新创建的构造函数中this()必须是一个。
2025-03-09 12:52:53
822
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
2