多线程
文章平均质量分 85
多线程编程
进朱者赤
阿里非典型程序员一枚:微信公众号同名,记录平平无奇程序员在大厂的打怪升级之路。
Java、大数据、数据结构算法
展开
-
Java性能优化(八)-多线程调优-线程池大小设置
今天我们主要学习了线程池的实现原理,Java线程的创建和消耗会给系统带来性能开销,因此Java提供了线程池来复用线程,提高程序的并发效率。Java通过用户线程与内核线程结合的1:1线程模型来实现,Java将线程的调度和管理设置在了用户态,提供了一套Executor框架来帮助开发人员提高效率。Executor框架不仅包括了线程池的管理,还提供了线程工厂、队列以及拒绝策略等,可以说Executor框架为并发编程提供了一个完善的架构体系。原创 2024-05-10 19:19:08 · 1096 阅读 · 0 评论 -
Java性能优化(七)-多线程调优-并发容器的使用
跳跃表是基于链表扩展实现的一种特殊链表,类似于树的实现,跳跃表不仅实现了横向链表,还实现了垂直方向的分层索引。一个跳跃表由若干层链表组成,每一层都实现了一个有序链表索引,只有最底层包含了所有数据,每一层由下往上依次通过一个指针指向上层相同值的元素,每层数据依次减少,等到了最顶层就只会保留部分数据了。跳跃表的这种结构,是利用了空间换时间的方法来提高了查询效率。程序总是从最顶层开始查询访问,通过判断元素值来缩小查询范围。我们可以通过以下几张图来了解下跳跃表的具体实现原理。原创 2024-05-09 08:30:00 · 1017 阅读 · 0 评论 -
Java性能优化(六)-多线程调优-乐观锁
LongAdder的原理就是降低操作共享变量的并发数,也就是将对单一共享变量的操作压力分散到多个变量值上,将竞争的每个写线程的value值分散到一个数组中,不同线程会命中到数组的不同槽中,各个线程只对自己槽中的value值进行CAS操作,最后在读取值的时候会将原子操作的共享变量与各个分散在数组的value值相加,返回一个近似准确的数值。LongAdder内部由一个base变量和一个cell[]数组组成。原创 2024-05-08 08:30:00 · 748 阅读 · 0 评论 -
Java性能优化(五)-多线程调优-Lock同步锁的优化
基本特点Lock锁的基本操作通常基于乐观锁实现,尽管在某些情况下(如阻塞时)它也可能采用悲观锁的策略。通过对比图,我们可以清晰地看到两种同步锁的基本特点。Lock同步锁与Synchronized的比较在Java中,同步锁机制是确保多线程安全访问共享资源的重要手段。与JVM隐式管理锁的Synchronized相比,Lock同步锁(以下简称Lock锁)提供了更细粒度的控制,通过显式地获取和释放锁,为开发者提供了更大的灵活性。一、基本特点。原创 2024-05-07 19:30:00 · 644 阅读 · 2 评论 -
Java性能优化(四)-多线程调优-Synchronized优化
JVM在JDK1.6中引入了分级锁机制来优化Synchronized,当一个线程获取锁时,首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取导致的用户态与内核态的切换问题;其次如果有多个线程竞争锁资源,锁将会升级为轻量级锁,它适用于在短时间内持有锁,且分锁有交替切换的场景;轻量级锁还使用了自旋锁来避免线程用户态与内核态的频繁切换,大大地提高了系统性能;但如果锁竞争太激烈了,那么同步锁将会升级为重量级锁。减少锁竞争,是优化Synchronized同步锁的关键。原创 2024-05-06 23:38:14 · 837 阅读 · 0 评论 -
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
工具类主要用途内部原理使用场景Semaphore控制访问某个或多个共享资源的线程数量基于AQS实现,维护一个许可计数器需要限制并发访问共享资源的场景,如连接池、线程池等允许一个或多个线程等待其他线程完成操作基于AQS实现,维护一个计数器用于协调一组线程的执行顺序,例如启动多个线程并行处理任务,并在所有任务完成后执行汇总操作让一组线程互相等待,直到所有线程都到达某个公共屏障点使用锁和条件变量实现,维护屏障的周期和计数器。原创 2024-04-15 11:49:45 · 1319 阅读 · 11 评论 -
Java8 CompletableFuture:异步编程的瑞士军刀
阿里非典型程序员一枚 ,记录平平无奇程序员在大厂的打怪升级之路。一起学习Java、大数据、数据结构算法(原创 2024-04-14 13:38:07 · 908 阅读 · 1 评论 -
Java多线程中顺序打印
方法特点使用volatile关键字适用于简单的顺序控制,代码简单,但不适用于复杂的线程同步和互斥情况。使用Lock和Condition提供了更丰富的线程同步和互斥机制,并可以精确控制线程的等待和唤醒,适用于复杂的线程交互情况。使用Semaphore通过信号量来控制线程的获取和释放,并可以灵活地控制线程的顺序,适用于多种线程同步场景。原创 2024-04-13 23:46:49 · 1113 阅读 · 19 评论 -
java常用的并发工具类
例如,用一个Excel保存了用户所有银行流水,每个Sheet保存一个账户近一年的每笔银行流水,现在需要统计用户的日均银行流水,先用多线程处理每个sheet里的银行流水,都执行完之后,得到每个sheet的日均银行流水,最后,再用barrierAction根据这些线程的计算结果,计算出整个Excel的日均银行流水。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。原创 2019-09-01 12:39:18 · 169 阅读 · 1 评论 -
重入锁及实现原理
在一个类中,如果synchronized方法1调用了synchronized方法2,方法2是可以正常执行的,这说明synchronized是可重入锁。否则,在执行方法2想获取锁的时候,该锁已经在执行方法1时获取了,那么方法2将永远得不到执行。释放锁时,需要给锁的获取次数减1,然后判断,次数是否为0了。如果次数为0了,则需要调用锁的唤醒方法,让锁上阻塞的其他线程得到执行的机会。可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。原创 2019-09-01 12:41:30 · 3055 阅读 · 1 评论 -
公平锁与非公平锁
根据线程获取锁的抢占机制,锁可分为公平锁和非公平锁。公平锁:线程获取锁的顺序是按照线程请求锁的时间顺序决定的,也就是最早请求的线程将最早获取到锁,即 FIFO 可用 JUC 中的lock提供了实现 ReentrantLock lock=new ReentrantLock (ture) 非公平锁:线程加锁时直接尝试获取锁,获取不到才排到队尾等待,不一定FIFO。代表:synchron...原创 2019-09-05 16:53:24 · 208 阅读 · 0 评论 -
并发下的ArrayList和HashMap
并发下的ArrayList和HashMap,摘选自《实战Java高并发程序设计》一书。原创 2020-07-06 19:15:21 · 186 阅读 · 0 评论 -
Synchronized的内部实现原理
synchronized的作用主要有三个:确保线程互斥的访问代码 保证共享变量的修改能够及时可见(可见性) 可以阻止JVM的指令重排序在Java中所有对象都可以作为锁,这是synchronized实现同步的基础。synchronized主要有三种应用方式:普通同步方法,锁的是当前实例的对象 静态同步方法,锁的是静态方法所在的类对象 同步代码块,锁的是括号里的对象。(此处的可以是...原创 2019-09-05 17:38:16 · 718 阅读 · 1 评论 -
Java技术之AQS详解(AbstractQueuedSynchronizer)
但共享模式下,多个线程是可以同时执行的,现在因为老二的资源需求量大,而把后面量小的老三和老四也都卡住了。正常来说,tryRelease()都会成功的,因为这是独占模式,该线程来释放资源,那么它肯定已经拿到独占资源了,直接减掉相应量的资源即可(state-=arg),也不需要考虑线程安全的问题。跟独占模式下的release()相似,但有一点稍微需要注意:独占模式下的tryRelease()在完全释放掉资源(state=0)后,才会返回true去唤醒其他线程,这主要是基于独占下可重入的考量;原创 2019-09-01 12:35:55 · 1487 阅读 · 1 评论 -
Java对象锁的分类
|;原创 2021-07-09 18:51:53 · 165 阅读 · 0 评论 -
并行和并发的区别
并发:同一时间段,做多件事情并行:同一时刻,做多件事情图片来自:https://www.jianshu.com/p/c334f8198f9b原创 2019-09-09 17:43:22 · 157 阅读 · 0 评论 -
Java技术之AQS详解(AbstractQueuedSynchronizer)
但共享模式下,多个线程是可以同时执行的,现在因为老二的资源需求量大,而把后面量小的老三和老四也都卡住了。正常来说,tryRelease()都会成功的,因为这是独占模式,该线程来释放资源,那么它肯定已经拿到独占资源了,直接减掉相应量的资源即可(state-=arg),也不需要考虑线程安全的问题。跟独占模式下的release()相似,但有一点稍微需要注意:独占模式下的tryRelease()在完全释放掉资源(state=0)后,才会返回true去唤醒其他线程,这主要是基于独占下可重入的考量;原创 2019-09-04 00:26:17 · 145 阅读 · 1 评论 -
ThreadLocal和Synchonized
ThreadLocal 和 synchronized 是 Java 中用于实现线程安全的两种机制,它们之间有以下几点区别原创 2019-09-04 00:20:57 · 141 阅读 · 1 评论