![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 87
高并发编程知识
一杯可乐、
专注于java后端和linux运维领域
展开
-
Java-基准测试
JMH是一个用于编写可靠Java微基准测试的工具。它可以帮助开发者量化代码片段的执行时间,这对于理解代码性能至关重要。通过JMH,开发者可以比较不同算法或代码实现的性能,从而做出基于数据的优化决策。JMH的设计考虑了基准测试中的各种陷阱,如JVM的热点优化、死码消除和垃圾收集暂停。它提供了一组注解和工具类,使得编写、配置和运行基准测试变得简单而直观。原创 2024-01-15 22:32:52 · 937 阅读 · 0 评论 -
java-ArrayBlockingQueue详解
是一个基于数组实现的阻塞队列,它继承自并实现了接口。这个队列在创建时需要指定一个固定的大小,之后这个大小就不能再改变了。当队列满时,如果再有新的元素试图加入队列,那么这个操作会被阻塞;同样地,如果队列为空,那么从队列中取元素的操作也会被阻塞。这种特性使得非常适合作为生产者-消费者模式中的缓冲区。是Java并发编程中一个非常实用的工具类。它提供了线程安全的阻塞队列实现,支持生产者-消费者模式,并允许通过队列的大小来控制系统的流量。在使用。原创 2024-01-13 22:36:33 · 1552 阅读 · 10 评论 -
Java并发Condition 详解
Condition接口在Java并发编程中的重要性和优势。它提供了更为灵活和强大的等待/通知机制,支持多条件同步、可中断等待和定时等待等高级特性。在使用Condition时,我们需要注意一些常见问题,以确保程序的正确性和性能。原创 2024-01-12 23:08:46 · 1246 阅读 · 4 评论 -
StampedLock详解
是一个强大的同步工具,它在特定的使用场景下可以提供比传统锁更高的性能。原创 2024-01-12 12:35:40 · 997 阅读 · 2 评论 -
Phaser详解
Phaser是Java并发工具包中一个强大而灵活的组件,它提供了协调并行任务执行的高级机制。在处理复杂的多线程问题时,考虑使用Phaser可以使代码更加简洁且易于管理。原创 2024-01-11 22:29:49 · 919 阅读 · 6 评论 -
ReentrantLock详解
通过源码流程分析让我们更加深入了解了ReentrantLock锁的实现流程。原创 2023-12-12 21:58:28 · 1012 阅读 · 0 评论 -
java-Exchanger详解
Exchanger类可用于在两个类型为T的线程之间共享对象。该类仅提供了一个重载的方法exchange(T t)。当调用exchanger时,它会等待成对的另一个线程也调用它。在这一点上,第二个线程发现第一个线程正在等待其对象。线程交换它们持有的对象并发出交换信号,然后它们可以返回。让我们看一个例子,以理解两个线程之间使用Exchanger@Testtry {try {在这里,我们有两个线程使用共同的Exchanger交换彼此之间的消息。@Testtry {原创 2024-01-10 22:39:38 · 712 阅读 · 7 评论 -
java并发-HashMap 为什么是线程不安全的
很明显,很快这个程序就抛出了我们所希望看到的 RuntimeException,并且我们把它描述为:HashMap is not thread safe,一旦它能进入到这个 if 语句,就已经证明它所取出来的值是 null,而不是我们期望的字符串 “v”。可见性也是线程安全的一部分,如果某一个数据结构声称自己是线程安全的,那么它同样需要保证可见性,也就是说,当一个线程操作这个容器的时候,该操作需要对另外的线程都可见,也就是其他线程都能感知到本次操作。的值的时候,它的可见性是无法保证的,也就是说。原创 2023-12-19 22:45:20 · 1098 阅读 · 0 评论 -
java并发-ReentrantReadWriteLock读写锁
读写锁就是将一个锁拆分为读锁和写锁两个锁。此文章主要介绍了ReentrantReadWriteLock使用以及相关源码部分;更深刻的去理解读写锁的使用和使用场景。原创 2023-12-13 22:52:52 · 1424 阅读 · 2 评论 -
java并发-CountDownLatch使用
它是 JDK 提供的并发流程控制的工具类,它是在 java.util.concurrent 包下,在 JDK1.5 以后加入的。CountDownLatch在构造函数中传入倒数次数,在await 方法开始等待,countDown 方法之后,计数便会减 1,直到减为 0时,之前等待的线程便会继续运行。原创 2023-12-14 20:57:18 · 975 阅读 · 0 评论 -
java并发-CyclicBarrier使用
它是 Java 中用于多线程同步的一个工具类,它允许一组线程互相等待,直到所有线程都达到某个屏障点(barrier),然后再同时执行。原创 2023-12-15 23:48:18 · 1725 阅读 · 0 评论 -
java并发-ConcurrentHashMap 在Java7 和 8 的区别
正是由于这些规则和要求的限制,红黑树保证了较高的查找效率,好处就是避免在极端的情况下冲突链表变得很长,在查询的时 候,效率会非常慢。,是一种平衡二叉查找树,查找效率高,会自动平衡,防止极端不平衡从而影响查找效率的情况发生。反观链表,它的时间复杂度就不一样了,如果发生了最坏的情况,可能需要遍历整个链表才能找到目标元素,时间复杂度为。put 方法的核心是 putVal 方法,为了方便阅读,我把重要步骤的解读用注释的形式补充在下面的源码中。,远远大于红黑树的 O(log(n)),尤其是在节点越来越多的情况下,原创 2023-12-20 21:36:47 · 1053 阅读 · 2 评论 -
AtomicBoolean详解
AtomicBoolean的使用方法,通常情况下,我们可以使 用AtomicBoolean来进行某个flag的开关控制。原创 2024-01-09 22:00:27 · 1748 阅读 · 4 评论 -
Semaphore信号量详解
Semaphore是一个强大而灵活的同步工具,它允许我们细粒度地控制对资源的并发访问。通过合理地使用Semaphore,我们可以确保系统在高并发环境下的稳定性和性能。原创 2024-01-11 21:45:47 · 1535 阅读 · 10 评论 -
java并发-AtomicInteger详解
本文介绍了相关的方法,通过源码很明显看出底层是通过cas+自旋实现。原创 2023-12-27 23:12:02 · 1265 阅读 · 2 评论 -
java synchronized详解
是 Java 中用于实现线程同步的关键字,它提供了对代码块、方法以及静态方法的同步支持。以下是关于可以用于实现对对象的同步,确保同一时刻只有一个线程能够访问被同步的代码块或方法。对象锁的粒度可以是对象实例(实例方法)或类(静态方法)。可以直接修饰方法,使整个方法具有同步性。此时,锁对象是方法所属的对象实例。修饰实例方法时,锁对象是方法调用的实例;修饰静态方法时,锁对象是类的 Class 对象。还可以用于修饰代码块,指定锁的粒度更加灵活。原创 2023-12-04 22:54:29 · 2267 阅读 · 1 评论 -
java Lock锁的使用
引入**Lock**Lock接口提供了比传统的关键字更为灵活和可扩展的锁定机制。在包中定义了多个实现了Lock接口的类,其中最常用的是。使用lock()方法来获取锁。这一步类似于使用关键字进行同步,但提供了更灵活的控制。try {// 执行需要同步的代码块在finally块中使用unlock()方法释放锁,确保锁的释放,避免死锁和其他并发问题。使用方法可实现可中断的锁获取。在等待锁的过程中,线程可以被中断,以避免长时间的阻塞。try {// 可中断地获取锁// 执行需要同步的代码块。原创 2023-12-02 21:00:58 · 1076 阅读 · 0 评论 -
浅谈java中的锁
可中断锁是一旦线程申请了锁,就没有回头路了,只能等到拿到锁以后才能进行其他的逻辑处理。故名思就是偏向锁的拥有者,就可以直接获得锁,开销很小,性能最好。的理念正好诠释了共享锁和独占锁,读锁是共享说而写锁就是独占锁。非可重入锁线程获取到锁,在不释放的情况下不能再次获取锁。可重入锁指是线程当前已经持有这把锁了,能在不释放这把锁。轻量级锁不满足就会生成重量级锁,重量级锁会让其他。锁发生的顺序:无锁→偏向锁→轻量级锁→重量级锁。它是从偏向锁升级到的轻量级锁,竞争时间短,用。的情况下,再次获取这把锁。原创 2023-11-30 21:49:14 · 541 阅读 · 0 评论 -
ThreadLocal类的使用
达到线程安全;不需要加锁,提高执行效率;更高效地利用内存,节省开销;免去传参数的麻烦;主要注意:内存泄漏的问题。原创 2023-11-26 20:10:44 · 982 阅读 · 3 评论 -
大话线程池
CPU密集型(加密、计算hash等) : 最佳线程数为CPU核心数的1-2倍左右。耗时IO型(读写数据库、文件、网络读写等 ) : 最佳线程数般会大于cpu核心数很多倍,以JVM线程监控显示繁忙情况为依据,保证线程空闲可以衔接上,参考Brain Goetz推荐的计算方法:线程数=CPU核心数*( 1+平均等待时间/平均工作时间 )原创 2023-11-25 17:28:22 · 1637 阅读 · 3 评论 -
【多线程5】java多线程那些基础
1. 为什么使用线程2. 线程的状态注意:线程启动最好起一个名字方便排查问题3.线程的中断中断相关介绍安全的中断4.线程间通信等待/通知机制等待/通知的经典示范Thread.join()的使用ThreadLocal的使用5. 线程应用实例...原创 2020-12-09 00:06:33 · 93 阅读 · 0 评论 -
【多线程3】java内存模型以及指令重排序理解
背景掌握好多线程知识对java内存模型的了解也是必不可少的还有指令重排序问题。java内存模型抽象结构线程1将x=1写入本地内存,然后本地内存在刷入主内存;线程2将x=1从主内存中读取出来,然后在存入本地内存。指令重排序重排序是值编译器和处理器为了优化程序性能而对指令序列进行冲洗排序的一种手段。我们先看下面的代码package com.enjoy.cap1;/** * @author: dalele * @date: 2020/11/21 19:53 * @description:原创 2020-11-22 00:23:20 · 91 阅读 · 0 评论 -
【多线程2】硬件级别以及sychronized原理
背景多线程在我们实际开发中和面试中都是很热门的。我们这次就聊一聊底层相关知识。硬件级别1.缓存一致性具体情况如上图所示处理器会嗅探消息总线如果发现了数据有修改处理器将自己本身的数据设置为无效,然后更新到缓存在将数据写回到内存。2.MESI协议需要进一步了解synchronized原理对于普通同步方法,锁是当前实例的对象;对于静态同步方法,所得是当前类的class对象;对于同步方法快,锁是Sychronized括号里面的配置对象。synchronized锁升级的对比(1)偏向锁的撤销原创 2020-11-17 00:18:37 · 242 阅读 · 0 评论 -
【多线程1】多线程执行就一定效率更快吗?
多线程执行就一定效率更快吗?显然不是的。1. 上下文切换一个线程在执行的过程中然后记录一下这个线程当前的状态突然间停止,然后切换到下一个线程执行,这个现象就叫做上下文切换。比如说我在看书的时候突然遇到一个英文单词不认得了,然后记录这本书看到了多少页了,再拿起英文翻译书查查这个单词的意思。2.示例代码public class ConcurrencyTest { private static final long count=10000L; public static void m原创 2020-11-11 00:14:28 · 832 阅读 · 2 评论