《Java高并发编程》系列
文章平均质量分 76
java基础、高并发编程、锁、集合、IO等
一只IT攻城狮
一个喜欢诗和远方的程序媛
展开
-
关于Java并发编程你真的理解了吗?到底打印A还是B呢?
一道真实的大厂笔试题,看看你能答对吗?原创 2024-08-04 11:07:12 · 899 阅读 · 0 评论 -
Java内存模型(JMM)详解
Java内存模型(JMM)提供了一组规则,确保多线程程序在不同平台上的一致性和正确性。通过理解JMM的核心概念、关键字和同步机制以及 happens-before 规则,开发者可以编写出高效且线程安全的并发程序。原创 2024-06-18 11:05:45 · 1483 阅读 · 0 评论 -
阻塞队列:ArrayBlockingQueue和LinkedBlockingQueue区别
ArrayBlockingQueue和LinkedBlockingQueue是Java中常用的两种阻塞队列,它们在内部实现和适用场景上有一些显著的区别。阻塞队列的实现通常依赖于底层的锁机制和条件变量。Java中的java.util.concurrent包提供了。(BlockingQueue)是一种特殊类型的队列,它用于在多线程环境中实现线程之间的通信。等多种阻塞队列实现,分别适用于不同的使用场景。原创 2024-06-18 09:40:40 · 922 阅读 · 0 评论 -
有三个线程T1,T2,T3,如何保证顺序执行
线程顺序执行,几种常见的实现方法原创 2024-06-18 09:37:54 · 234 阅读 · 0 评论 -
一文读懂java性能优化(最全干货篇)
性能优化:是指针对计算机系统或应用程序的性能进行改善的一系列技术和方法。性能优化的目标:是提高系统或应用程序的响应时间吞吐量效率和可伸缩性等方面的性能指标。性能优化需要有一些技巧:对于一个整个产品或项目而言,比如可以从前端优化、后端优化、架构优化、高并发优化、Linux内核优化、常用中间件优化等方便去优化,当然每个方面侧重点不同,用的技术点也不同。当然除了上述从技巧方面做优化,我们也必须通过使用性能测试工具进行性能基准测试,并根据测试结果进行有针对性的优化。原创 2024-01-03 16:35:40 · 1554 阅读 · 0 评论 -
一文搞懂常见限流算法:计数器、滑动窗口、漏桶、令牌桶
在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自身系统和下游系统不被巨型流量冲垮等。你要开发一个限流的框架,那么必不可少的就是要选择一种合适的限流算法。限流算法很多,常见的有几类分别是:计数器算法、滑动窗口算法、漏桶算法、令牌桶算法,具体视业务场景,统计的精准度,限流维度而定。原创 2023-08-29 11:07:47 · 626 阅读 · 0 评论 -
【面试必问系列】之ReentrantLock详解
的队列,可以用于构建锁的基础框架,内部通过原子变量state来表示锁的状态,当state大于0的时候表示锁被占用,如果state等于0时表示没有占用锁,ReentrantLock是一个重入锁,表现在state上,如果持有锁的线程重复获取锁时,它会将state状态进行递增,也就是获得一个信号量,当释放锁时,同时也是释放了信号量,信号量跟随减少,如果上一个线程还没有完成任务,则会进行入队等待操作。而用synchronized修饰的话,当一个线程处于等待某个锁的状态,是无法被中断的,只有一直等待下去。原创 2021-01-08 17:16:55 · 4860 阅读 · 1 评论 -
【面试必问系列】之如何解决CAS的ABA问题?
CAS:Compare and Swap,比较并交换。java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。原创 2021-01-15 15:32:28 · 751 阅读 · 1 评论 -
【面试必问系列】之BIO、NIO、AIO有什么区别?
【面试必问系列】之BIO、NIO、AIO有什么区别?原创 2021-01-11 18:03:13 · 719 阅读 · 0 评论 -
HashMap和ConcurrentHashMap详解
HashMap工作原理1)HashMap通过put和get方法存储和获取;2)存储对象时将K/V传给put();调用hash()方法计算K的hash值,然后结合数组长度(n-1)& hash计算数组下标;3)调整数组大小, 容器中元素个数大于capacity*loadfactor时,容器自动扩容resize为2n;4)如果k的hash值在hashmap中不存在,则插入,若存在,则碰撞;5)如果k的hash值在hashmap中存在,切equals()返回true,则更新键值对,若返回false,则插原创 2021-01-12 14:57:53 · 320 阅读 · 0 评论 -
list转成部门组织机构树
一二级部门混合在list中,如何变成组织机构数DeptUserInfoBO.java/** * 部门成员信息表 */@datapublic class DeptUserInfoBO{ private Long id; private Integer pageNo = 1; private Integer pageSize = 10; private Integer groupType;//机构登记 一级机构1,二级机构2 private String gr原创 2022-03-29 11:49:19 · 676 阅读 · 0 评论 -
list集合取交集、并集
public static void main(String[] args) {List list1 = new ArrayList();list1.add(“1”);list1.add(“2”);list1.add(“3”);list1.add(“5”);list1.add(“6”); List<String> list2 = new ArrayList<String>(); list2.add("2"); list2.add("3");原创 2021-12-31 12:11:56 · 995 阅读 · 0 评论 -
stream常用场景filter、groupingBy、mapping
JDK1.8 stream常用场景原创 2022-03-29 12:04:41 · 1108 阅读 · 0 评论 -
java中如何创建一个线程?
从程序运行效率的角度来看,单核 CPU 不但不会发挥出多线程的优势,反而会因 为在单核 CPU 上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是如果把这个大的任务 A 分解成几个小任务,任务 B、任务 C、任务 D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。多次执行会发现结果不一定,四个任务,不一定线程池中哪个线程来执行,这是随机的,execute会首先在线程池中选择一个已有空闲线程来执行任务,如果线程池中没有空闲线程,它便会创建一个新的线程来执行任务。原创 2023-04-06 12:59:03 · 1068 阅读 · 0 评论 -
线程生命周期及五种状态
其他阻塞:通过调用sleep方法或者join方法或者发出I/O请求时,线程会进入阻塞状态,当sleep()状态超时,或者join()等待线程终止或者超时,或者I/O处理完毕,线程重新转入就绪状态;当前线程调用join(),则线程转为阻塞状态,eg:A线程中插入了B.join(),则B先执行,执行完,A线程继续执行;调用该方法,线程进入waiting状态,只有等待另外的线程通知或被中断才会返回,调用wait()后,会释放对象锁,因为wait方法一般用在同步方法或者同步代码块中。原创 2023-04-06 11:48:16 · 2307 阅读 · 0 评论 -
Java多线程之Executor框架
创建后便进入运行状态,当调用了shutdown()方法时,便进入关闭状态,此时意味着ExecutorService不再接受新的任务,但它还在执行已经提交了submit()的任务,当已经提交了的任务执行完后,便到达终止状态。STOP(001):不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。TIDYING(010):如果所有的任务都已终止了,workerCount (有效线程数) 为0,线程池进入该状态后会调用 terminated() 方法进入TERMINATED 状态。原创 2023-04-06 11:41:06 · 742 阅读 · 0 评论 -
java中的保护性暂停模式
一、概念保护性暂停模式(Guarded Suspension Design Pattern):当线程在访问某个对象时,发现条件不满足时,就暂时挂起等待条件满足时再次访问。如果某个结果需要在多线程之间传递,则可以让这些线程关联到一个对象GuardedObject,但是如果这个结果需要不断的从一个线程到另一个线程那么可以使用消息队列(生产者/消费者)Thread.join()、Future就采用了保护性暂停模式。二、保护性暂停模式的实现@Slf4jpublic class Test { /原创 2021-01-07 15:43:12 · 514 阅读 · 0 评论 -
java中常见的零散知识点
一、wait()、notify释放锁问题wait()会立刻释放synchronized(obj)中的obj锁,以便其他线程可以执行obj.notify()但是notify()不会立刻立刻释放sycronized(obj)中的obj锁,必须要等notify()所在线程执行完synchronized(obj)块中的所有代码才会释放这把锁.yield(),sleep()不会释放锁。二、什么是java的局部变量、成员变量和全局变量?1、局部变量:在方法内定义的变量称为“局部变量”或“临时变量”,方法结束后局原创 2021-01-06 18:39:47 · 158 阅读 · 0 评论 -
一文了解并发编程中锁的分类
1、认为共享资源并发操作一定会出现问题,使用关键字或者lock接口特性加锁;2、认为不加锁给并发操作带来性能提升,常采用CAS自旋锁;典例就是,通过CAS自旋来更新值。原创 2021-04-01 11:27:57 · 438 阅读 · 0 评论 -
多线程分批处理数据及MyBatis的批量插入
多线程分批处理时,那如何分批,怎么计算批次数呢?MyBatis批量插入示例原创 2021-12-05 18:14:55 · 3928 阅读 · 0 评论 -
Thread源码分析-手写线程
start0(),被Native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的(eg:C++/C)。小结:1、start()开始创建一个实质线程(不是指线程对象,而是OS中的线程),所以Java的线程和操作系统线程是一一对应的。3)java的Thread是调用start(),假设我们手写的将来是调用start1()让它开启一个线程(名字随意起);(Windows环境下,所以用的是一 个.dll文件,如果在Linux环境下的话,用的是一个.so文件)2)包含一个native的方法;原创 2021-01-06 18:14:22 · 359 阅读 · 0 评论 -
rsa公钥私钥生成工具
【代码】rsa公钥私钥生成工具。原创 2022-12-29 16:45:12 · 2062 阅读 · 0 评论