- 博客(22)
- 问答 (6)
- 收藏
- 关注
原创 JUC学习----线程池,异步方法回调
BlockingQueue workQueue,阻塞队列,如果任务有很多,就会将目前多的任务放入队列,只要有线程空闲,就会在队列里取新的任务放进去,继续执行。如果当前线程数量大于核心数量,会释放空闲的线程,只要空闲的线程超时,释放。核心线程7个处理,然后50个任务进入阻塞队列,然后剩下的13个再次处理,这下就已经处理了70个任务,30个使用拒绝策略。说一个问题,现在核心线程为7,最大线程为20,阻塞队列为50,现在有100个任务进来。3.线程池根据需求创建线程,可扩容,遇强则强。
2023-06-06 21:34:33
209
原创 JUC学习---ReentrantReadWriteLock
乐观锁会在资源上加一个版本号,每次进行修改,会将版本号进行对比,如果相等,则进行修改,实际上,并不会对资源进行加锁底层时CAS,使用了一个自旋的方式去进行对比,交换。但行锁可以造成死锁,比如第一个线程将第一行锁住,想要获取第二行,但第二个线程将第二行锁住,想要获取第一行,资源一直得不到释放,即发生死锁。但当引入读写锁时,问题就不一样了,即在现实中,读操作远远大于写操作,所以引入了读锁是共享的,而写锁是独占的。就比如抄作业,可以当一个人边写,你边抄,当他写完了,你也抄完了。在锁中有乐观锁和悲观锁。
2023-06-06 17:54:18
46
原创 JUC强大的辅助类学习
CyclicBarrier的构造器为如下所示,构造器中要实现Runnable接口,直接用Lambda表达式,当没有达到7时,则不执行Lambda中的语句,达到后再执行。用一个停车的例子来说,当只有3个停车位,但有6辆车要入库,则当1辆车进入,就占有一个,3个车进入后,则后面二点车不能进入必须等待有一辆车离开后才能进入。设置一个信号量,当信号量为0时,则处于等待状态,一个线程结束,则释放信号量,另一个线程则可以运行。对于这个,当我们离开学校时,等每一个班的孩子走完了才能锁门。3.Semaphore信号灯。
2023-06-06 16:29:32
55
原创 JUC学习6(Callable)
创建线程的四种方式1.实现Thread类2.继承Runnable接口3.继承Callable接口4.线程池对于Runnable和Callable接口Runnable接口不能得到方法的返回值,但Callable接口可以得到返回值,并可以得到方法的异常我们来实现一下这两个接口对于Runnable接口,可以直接实现但Runnable接口是一个函数式接口,可以用匿名实现类但对于Callable接口来说就不行了这时就要用到设计模式中的适配器模式,有这么一个类FutureTask它实现了Runnable接口
2023-06-06 11:34:41
49
原创 JUC学习5(锁)
但这个可能也不是死锁,比如死循环,或者睡眠也有一样的结果,即我们只有两个工具jps和jstack(必须配置环境变量)非公平锁会提升效率,但可能会使线程一直拿不到锁饿死(线程长时间得不到资源从而一直得不到执行)3.对于同步方法块,锁的时Synchronized括号里配置的对象。1.对于普通的同步方法,锁的是当前的实例对象就是this。公平锁:多个线程按照申请锁的顺序进入队列,从而的到锁。2.对于静态同步方法,锁的是当前的Class对象。而它报错的内容为堆栈溢出,但说明了它是可重入锁。
2023-06-05 22:09:49
28
原创 JUC学习(4)集合安全的学习,以及解决
当多个线程对list集合进行一个add和查看时就会发生java.util.ConcurrentModificationException。这个的原理为,当读的读写异步,在读的时候将旧的数据复制一份,用旧的数据进行读,用心的数据进行写。CopyOnWriteArraySet()的原理本质上和CopyOnWriteArrayList()一样。Collections.synchronizedList()的解决方案。hashMap的线程不安全问题的解决。2.hashSet的解决方案。3.hashMap的解决方案。
2023-06-05 19:38:10
29
原创 JUC学习(3)线程之间的通信,且定制化通信
就像是,两个进行减减操作的线程,当a线程进行--时,判断没成功,被b线程抢到,而b线程进行--也没成功,阻塞,这时被a线程进行抢到,但wait方法会从当前阻塞处继续执行,从而,a线程执行--操作,使0变为-1。---->进行线程之间的等待,或者唤醒。为什么会出现-1,这就是线程的虚假唤醒问题,因为,当先线程进入wait方法时,进行了一个阻塞,而当唤醒时,不经过if的判断。---->对线程的加锁解锁。aa线程打印一句话------>bb线程打印一句话2次-------->cc线程打印一句话3次。
2023-06-05 18:45:06
43
原创 JUC学习(2)Lock接口
lock需要自己去手动上锁和解锁,当没有解锁时,可能会导致死锁(要在finally关键字中进行解锁),synchronized不需要用户手动释放锁。lock是个类,不是java语言内置的,synchronized是java的关键字。1.创建资源类,定义其相应的属性和方法 Ticket。2.创建多个线程,调用资源类的操作方法。2.使用lock接口同样去实现一个上锁和解锁的过程。创建3个线程循环的去调用这个卖票的方法,直到卖完为止。在Ticket类中创建相应的方法。再进行一个相应的调用。
2023-06-05 12:53:32
30
原创 JUC学习(1)--->概述
2.sleep不会释放锁,也不需要占用锁,wait会释放锁,但调用它的前提是当前线程必须占有锁,即在synchronized中。就是在执行时,持有管程对象,在结束时,释放管程对象,而jvm同步基于进入和退出,使用管程对象实现的,进入要加锁,退出要解锁。是一种同步机制,保证同一个时间,只有一个线程访问保护数据,或者代码,而当主线程结束后,守护线程也会自动结束,即jvm结束。当主线程结束后,用户线程还没有结束,即jvm存活。2.主线程结束后,守护线程也会自动结束,即jvm结束。6.TERMINATED 终结。
2023-06-04 21:25:22
31
原创 String的常用用法
/从指定位置从后往前开始找字符串在指定子串中第一次出现的位置,没有则返回-1。//,从后往前找返回字符串在指定子串中的第一次位置,如果没找到,则返回-1。//从指定位置开始找字符串在指定子串中第一次出现的位置,没有则返回-1。//返回字符串在指定子串中的第一次位置,如果没找到,则返回-1。
2023-06-04 12:29:03
37
原创 SpringBoot的常用注解(2)
而@Qualifier也只有一个参数,当@Autowired的注入不成功时,value值就可以配合着Autowired使用,如果value和要注入的bean的类型比对没成功,则和bean的名字进行比对,因为Autowired的默认时按照类型进行装配。从源码来看,可以在resource上直接按照类型或者名字进行装配,默认是按照名称进行装配的,如果name属性指定了,但没有找到则报错,如果没有指定,则按照类型名进行匹配,匹配不到,则按照给出的字段名,进行匹配,匹配不到,则报错。如代码所示,有两个不同的Dao。
2023-06-03 22:48:19
38
原创 SpringBoot的常用注解(1)
controller注解会被解析为具体跳转路径,而加上了@ResponseBody,则不会经过视图解析器,从而返会什么数据,页面打印什么数据。value和name代表着参数的名字,required代表着是否需要出现在路径后,defaultValue代表默认的值。上面代码所示,id的required为false,从而如果没有id时则为null,而age给了默认值。而我们看到源码就不难发现value就是name,name就是value,两个不能同时出现,比如。如果需要这份小demo,这里时链接。
2023-06-03 21:28:41
31
原创 在jvm中,字符串的所处位置的学习
对于s3,在编译时就将"a"+"b"转换为"ab";但常量池中已经含有,则将s1指向常量池中的"ab";对于s1,则直接创建在常量池中,s2,则创建在堆空间中。在jvm中,字符串的创建有两种,为以下两种。本质上还是对象的创建,从而s2还是在堆中。而在jdk1.8中,当s2调用如下方法。返回的intern,则为常量池中的ab。而intern==s1则为true。而s2还在堆中,从而对于如下。返回结果为:false。
2023-05-27 22:01:13
68
2
原创 看看上面的代码里 stockDetailTo的Id是null还是save方法后保存到数据库里的值
看看上面的代码里 stockDetailTo的Id是null还是save方法后保存到数据库里的值。
2023-05-22 21:33:42
54
1
原创 nginx在前后端分离的项目中如何跨域(windows环境)
后端的具体端口:http://localhost:88/api(由网关再转发到具体的服务,进行过滤)最后的proxy_pass 就是所要转发的网关的端口,而之后再由网关转发到具体的服务。后端在前端中的暴露端口:http://localhost:8082/api。在nginx里的config文件夹里进行配置,找到nginx.conf。前端对外暴露端口:http://localhost:8080。用具体的if来判断跨域。
2023-05-04 15:33:28
244
原创 用数学规律找字母编排,去解决leedcode上的第6题
题目描述:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。请你实现这个将字符串进行指定行数变换的函数:比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。string convert(string s, int numRows);...
2022-01-23 20:54:29
71
原创 leedcode的第二题,用一种最简单的方法去做。
题目描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9
2022-01-10 22:45:55
83
原创 【无标题】
输入N个学生,m门课程的成绩,分别编写函数实现下列功能:(1)计算每个学生的平均分;(2)计算每个学生的总分;(3)计算每门课的平均分;(4)对N个学生按照总分由高到低排名;(5)计算每个学生平均分的方差要求:主函数调用每个函数计算相应结果并输出。1.将第一个要求,第二个要求,第五个要求可以结合在一起去设计算法,用二维数组去将课程和成绩排列!而N个学生和M个课程可以用宏定义在函数前面定义,算法就可以采用for循环去解决!具体算法呈现如下:void average(int a[n][m])
2021-12-10 16:05:51
1015
2
原创 2021-11-08
生活不易,给小哥一点支持!!!编写计算正方体、圆柱体、球体的表面积和体积的类。要去:(1) 这三个类有一个公共的基类;(2) 这三个类计算正方体、圆柱体、球体的表面积和体积的成员函数名字相同;(3) 按照运行时的多态性方法设计一个测试主函数,并进行测试。#includeusing namespace std;class body {protected:float length;float width;float height;double v;double s;public:vi
2021-11-08 19:40:08
221
2
使用glide加载本地电脑上的图片报错
2023-12-14
编写存储过程显示26个英文字母
2022-11-27
使用对象流添加数据,只显示第一次添加的数据,之后的读取不出来
2022-09-25
为什么输入是中文,输出是问号,这是为什么,感觉好奇怪,就是utf-8
2022-07-28
用c语言去替换字符串里特定子串
2022-06-28
想对字符串哈希,但一直错误
2022-05-31
我用链式存储,想从初始文件中查找数据然后读入另一个文件,但却报错
2022-01-05
为什么信息保存之后再运行,运行不出来
2021-12-23
一段程序中,cin为什么会解决这个问题,而scanf为什么会引起错误!
2021-12-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人