java
文章平均质量分 84
主要讲解java相关的内容
tuffy维
走出来
展开
-
手写一个线程池
自己手动写一个线程池的必要条件需要先了解我们使用的线程池的功能。为什么会有线程池?这是为了减少线程创建和销毁的开销。复用线程的目的。为了达到这个目的。预计方案是:需要一个存放任务的队列,主线程相当于生产者,在这个队列里面push任务,启动几个核心线程一直消费这个队列,然后执行其中的任务。原创 2024-03-12 00:08:42 · 437 阅读 · 1 评论 -
ConcurrentHashMap底层原理
1、并发结构不一致,1.7是segement+数组+链表,1.8是数组+链表+红黑树2、锁机制不一样,1.7是ReentRantLock机制对segement加锁,而1.8则通过CAS和Synchronized对表头进行加锁3、扩容方式不一样,1.7是对segement内部的表进行扩容,并且遍历oldtable,然后将数据迁移到新表中,而1.8使用多线程进行迁移,将旧表拆分成多个任务,分配给多个线程进行迁移。原创 2024-03-10 16:39:06 · 1219 阅读 · 0 评论 -
HashMap的底层实现
1、结构不一致,1.7是数组+链表,1.8是数组+链表+红黑树2、扩容时机,1.7是在扩容之后插入的数据,1.8是插入之后进行扩容3、插入方式不一样,1.7是头插入方法,使得链表数据在新表中是倒置的,1.8则是尾插入法,使得在新表中的数据是和老表中的插入顺序是一致的4、并发问题,1.7 头插入方法会导致在并发的时候死循环,1.8解决了此问题,使用尾插入方法,但是在扩容的时候先对table进行赋值,使得并发get的时候,获取到空值。原创 2024-03-09 23:58:48 · 916 阅读 · 0 评论 -
java之ReentrantLock
在讲RentrantLock之前需要先讲一下AQS和LockSupport,因为rentrantLock底层是用AQS实现的,而AQS中获取阻塞和唤醒底使用LockSupport实现的。原创 2024-02-03 23:52:10 · 1009 阅读 · 0 评论 -
java之Synchronized
为什么需要synchronized?在我们并发编程中,处理公共数据时,需要考虑多个线程同时处理导致的问题,这时候需要用到synchronized来修饰方法,保证其原子性。原创 2024-02-03 21:44:37 · 934 阅读 · 0 评论 -
java之CAS
cas顾名思义是比较交换,实现了并发安全特性的原子性,是基于硬件平台的汇编指令,也就是说基于硬件实现的,通过比较预期的值是否和内存中值是否一致,如果一致则更新,如不一致则重新获取内存的值进行比较。和其他实现原子性的方式不一样的是此方式不需要加锁,大大提高了执行效率,解决了加锁释放锁导致的上下文切换的问题。原创 2024-01-28 14:55:43 · 901 阅读 · 0 评论 -
java之voliate
线程安全的三大特性:原子性,可见性,有序性,但是voliate只是具备可见性和有序性,不具备原子性。原创 2024-01-27 01:08:49 · 1103 阅读 · 2 评论 -
java之线程基础
(1)new(3)blocking synchronized或者lock使用出现的状态(4)waiting wait notify出现的状态(5)time waiting sleep出现的状态一般在开发应用中,利用jstack打印的线程信息显示上述状态,这些状态可以帮忙定位相应的问题。原创 2024-01-09 00:43:29 · 385 阅读 · 0 评论