- 博客(76)
- 收藏
- 关注
原创 JUC----CopyOnWriteArrayList的原理与作用
从字面上看,CopyOnWriteArrayList就是写时复制。当有新元素添加时,首先是将原来的容器复制一份,然后在新容器中进行添加操作,添加完之后,再将指向旧容器的引用给指向新容器。好处是:并发读时不加锁,做到读写分离。CopyOnWriteArrayList有三个构造方法,分别是无参构造(创建一个空的),单参构造(传入一个集合或数组)
2024-11-20 13:04:46
151
1
原创 Java----代理
在Java中,代理是一种用于创建一个或多个服务的中间层,它可以拦截并处理程序对实际服务对象的请求。代理模式是一种设计模式,属于结构型模式,它允许程序员在不修改实际对象代码的情况下,增强或控制对它的访问。静态代理在编译时就已经确定代理类和原始类的关系。代理类通常与原始类实现相同的接口,然后在代理类中维护一个原始对象的引用,从而可以在调用原始对象方法前后添加额外的处理逻辑(例如日志记录、权限校验等)。2.动态代理:动态代理是在运行时动态创建的代理方式,不需要在编译时确定代理类。Java提供了类和接口来
2024-07-30 23:59:13
504
原创 Java----反射
反射就是允许对成员变量、成员方法和构造方法的信息进行编程访问。换句话来讲,就是通过反射,我们可以在不需要创建其对象的情况下就可以获取其定义的各种属性值以及方法。常见的应用就是IDEA中的提示功能,当我们使用某个对象,使用“.”的时候,IDEA会自动进行提示,会弹出一个显示关于该对象所有能调用的方法。除了获取构造方法,我们还可以使用反射获取其成员变量,包括其记录值、修饰符、数据类型等。
2024-07-30 21:17:51
578
原创 JUC----死锁
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局;当进程处于这种僵持状态,而且无外力作用时,它们都将无法再执行任务。
2024-07-30 14:46:46
272
原创 Java网络编程----TCP发送与接收数据
Java网络编程----TCP发送与接收数据,这里采用try-with-resource机制进行关闭各种资源,可以节省很多代码,需要注意是,这里的关闭顺序是括号填入对象的。
2024-07-29 21:14:30
523
原创 Java网络编程----UDP实现单播,组播,广播
UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
2024-07-29 18:04:39
1609
原创 Java----常见并发工具类
CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。例如:公司召集5名员工开会,等5名员工都到了,会议开始。我们创建5个员工线程,1个开会线程,几乎同时启动,使用CyclicBarrier保证5名员工线程全部执行后,再执行开会线程。CyclicBarrier的相关方法。
2024-07-28 19:47:48
475
原创 JUC----ConcurrentHashMap
在synchronized(f)同步块里面则是与HashMap一样遍历该链表,如果该key对应的链表节点已经存在,则更新,否则在链表的末尾新增该key对应的链表节点。综上所述,关于两个版本最突出的变化就是锁的范围不一样,1.7则是采用ReentrantLock将Segment锁起来了,里面包含着链表数组,而1.8则只锁了某个正在操作的链表,可见1.8的粒度更细了,这样多线程冲突就会大大降低,提高效率,说到效率我们在1.8的添加操作可以看到有判断树节点的操作,说明其又重新引入红黑树结构,加大查询效率。
2024-07-28 17:54:19
1091
原创 Java----CAS算法与AtomicInteger源码解读
为了确保对数据操作的原子性,在java.util.concurrent.atomic下定义许多关于各种基本类型数据的提供原子操作的类。这里我们以AtomicInteger为例子。AtomicInteger的本质:自旋锁 + CAS算法CAS的全称是: Compare And Swap(比较再交换);是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作,这个原子操作直接由处理器保证。
2024-07-28 14:27:14
948
原创 JUC----如何保证多线程下原子性
修改VolatileAtomicThread 类,这里因为是案例,我们直接去继承该实现类,就可以使用里面的类方法,在操作count前进行加锁操作,操作完count了之后直接释放锁。比如定义读锁即共享锁,其他线程读取到该资源,不会造成阻塞,还可以使用写锁即排他锁,其他线程无法修改锁定的资源,保证线程安全。5.synchronized关键字是非公平锁,即,不能保证等待锁的那些线程们的顺序,而Lock的子类ReentrantLock默认是非公平锁,但是可通过一个布尔参数的构造方法实例化出一个公平锁。
2024-07-27 22:06:09
602
原创 JUC----Volatile与JMM之间的联系
volatile保证不同线程对共享变量操作的可见性,也就是说一个线程修改了volatile修饰的变量,当修改写回主内存时,另外一个线程立即看到最新的值。但是volatile不保证原子性。
2024-07-27 21:10:52
974
原创 Thread----线程状态
需要注意的一点是,在Java中并没有声明运行状态,因为当我们的程序进行可执行状态时(Runnable),等待CPU的调度,由于当线程获得CPU执行权时,JVM会将当前线程交给操作系统去管理,所以在JVM中并不需要定义运行状态。当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?通过源码我们可以看到Java中的线程存在6种状态,每种线程状态的含义如下。
2024-07-24 18:05:13
362
原创 如何创建线程池?
自定义线程的几种情况:情况一:此时核心线程是3,最大线程是6,提交3个任务,此时线程池会创建三个线程,分别执行三个任务,不会创建临时线程。情况2:此时核心线程是3,最大线程是6,提交5个任务,此时线程池会创建三个线程去执行三个任务,剩下两个任务进行队列排队等待,不会创建临时线程。情况3:此时核心线程是3,最大线程是6,队伍长度为3,提交8个任务,此时会先创建三个线程执行三个任务,并让接下来三个任务进行等待队伍,剩下了2个任务。
2024-07-23 21:42:31
337
原创 TreeMap----源码分析
那么此时会使用key进行比较,首先会假定其已经实现了Comparable接口,然后尝试调用其compareTo方法,但是你会发现TreeMap里面从头都没有重写compareTo方法,其实这个时候如果这个键是String,他会String类型中已经重写的compareTo方法,实现比较。该重载方法有三个,1:键,2:值,3是否覆盖:true是覆盖,false则是保留,这和hashmap刚好反过来,hashMap中定义的是onlyIfAbsent,表示是否保留和此处相反。没有节点时,会调用以下方法,
2024-07-13 18:48:59
333
原创 LinkedList----源码分析
添加过程中的操作:当创建LinkedList类时,会调用其空参构造方法,将其参数进行初始化,里面有:当我们进添加元素的时候,此时会调用我们的linkedLast方法,然后将我们要添加的元素放入一个Node内部类中进行封装,如下:在调用linkedLast方法:
2024-07-11 23:04:22
333
原创 ArrayList----源码分析
List接口的可调整数组实现。实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是不同步的。)size、isEmpty、get、set、iterator和listiterator操作在常量时间内运行。添加操作在平摊常数时间内运行,即添加n个元素需要O(n)时间。所有其他操作都在线性时间内运行(粗略地说)。与LinkedList实现相比,常数因子较低。
2024-07-11 22:57:58
877
原创 Springboot整合文心一言----非流式响应与流式响应(前后端)
Springboot整合文心一言----非流式响应与流式响应(前后端)
2024-04-26 16:10:05
3016
1
原创 第十四届蓝桥杯第十题:蜗牛分享
蜗牛路线:(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0),花费时间为 1+10.7+0+11.3+1≈4.201+0.71+0+1.31+1≈4.20。输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。当状态分析好以及状态方程定义好就成功了大半!
2024-03-29 17:41:15
1290
1
原创 LeetCode热题100第49题----题目分享
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。
2023-08-10 21:07:11
428
原创 Vue2----Uniapp自定义弹窗
对于擅长后端的程序员,在编写前端时常常回去找库,比如elementUI,uview之类,但是往往这些库较为冗杂,有些功能比较强大,基本用不到,不好理解。这时候,如果可以自定义组件可能会对开发起到更好的效果,虽然会消耗一定的时间去学习Css等,但是有可能比花费时间去理解官方文档更快噢。
2023-07-10 15:26:41
1093
原创 Spring开启事务----银行小案例
因为除数不能为零,所以会报错,一报错事务就会回滚,所以此时可以查看数据库信息,是不会变化的。(可以将int i = 1/0的语句去掉,看看你的其他类编写是否正确,之后再进行事务的测试)properties的文件可以看我的另外一篇文章,
2023-03-23 22:51:06
340
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人