《并发编程》专栏
文章平均质量分 93
并发编程的基本使用以及底层原理介绍
Run,boy
别犹豫,就现在
展开
-
线程池的合理使用
线程池(Thread Pool)是一种基于池化思想管理线程的工具,在Java中的体现是ThreadPoolExecutor类。由于线上核心线程数和最大线程数配置太小10-20,平时访问人数可能没有多少,但是一旦运营搞活动就会访问到首页的灵感盒子功能,导致请求进行堆积阻塞,处理不过来,导致对应服务大面积超时。经过分析压测,最终调整核心线程数和最大线程数100-300,同时拒绝策略由调用者线程改为直接丢弃策略,同时利用本地缓存使得请求快速响应,最终达到一个单机的性能瓶颈,使得线程池的合理使用达到一个最佳的状态。原创 2024-07-08 17:52:09 · 969 阅读 · 0 评论 -
Jdk1.7之HashMap源码总结
发现ALTERNATIVE_HASHING_THRESHOLD = threshold,说明threshold变量赋的值,那threshold又是哪里来的,往上找会发现jdk.map.althashing.threshold,如果配置了该环境变量,就可以取到对应的值赋值给threshold ,如果没有配置该变量就取一个int 最大值 threshold = Integer.MAX_VALUE。尝试找几个数字测试后发现,可以看出与我们想要的结果相反,我们想要的是找到一个大于等于的。原创 2023-09-04 16:16:08 · 222 阅读 · 0 评论 -
Java之线程的状态
进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而超时等待状态相当于在等待状态的基础上增加了超时限制,也就是超时时间到达时将会返回到运行状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到阻塞状态。阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为iava.concurrent包中Lock接口对于阻塞的实现均使用了LockSupport类中的相关方法。原创 2023-08-20 15:06:55 · 174 阅读 · 0 评论 -
JMM内存模型之happens-before阐述
如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照 happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法。原创 2023-08-17 21:34:09 · 221 阅读 · 0 评论 -
Unsafe类的简单介绍
Java中的Unsafe类是一个非常强大且危险的工具类,它提供了直接操作内存和执行低级别操作的方法,例如直接操作对象的属性和数组元素、分配和释放内存、执行CAS(Compare and Swap)操作等。Unsafe类通常被JDK内部使用,而且不建议在普通的应用程序中使用。由于Unsafe类的功能非常底层,它可以绕过Java语言的访问控制机制和安全检查,直接对内存进行操作。这也是为什么它被称为"Unsafe",因为它可以导致程序在运行过程中出现不安全的情况,例如内存泄漏、数组越界、数据竞争等。原创 2023-08-03 00:41:50 · 230 阅读 · 0 评论 -
Jdk1.7之ConcurrentHashMap源码总结
ConcurrentHashMap是Java中的一个线程安全的哈希表实现,它在多线程环境下提供了高效的并发访问。原创 2023-09-09 14:56:48 · 275 阅读 · 0 评论 -
实现线程同步的几种方法
线程同步是指在多线程环境下,通过协调和控制线程的执行顺序和访问共享资源的方式,确保线程之间能够按照一定的顺序合作和共享资源,以避免竞争条件和数据不一致的问题。在多线程环境中,由于多个线程同时访问共享资源,可能会导致数据不一致或者竞争条件的问题。线程同步的目的就是保证共享资源的一致性和正确性,避免出现数据错误或者程序异常的情况。线程同步的实现可以通过使用同步关键字、锁对象、条件变量等手段来实现。通过合理地使用线程同步机制,可以保证多线程程序的正确性和稳定性,避免出现数据错误和程序崩溃的情况。原创 2023-07-24 11:57:58 · 2284 阅读 · 0 评论 -
synchronized是如何保证原子性、可见性、有序性的
在锁未释放之前,其他线程无法再次获取锁,因此通过monitorenter和monitorexit指令可以保证被synchronized修饰的代码在同一时间只能被一个线程访问,其他线程在锁未释放之前无法访问该代码块。例如,线程1获得时间片开始执行,但在执行过程中,CPU时间片耗尽,线程1需要让出CPU。因此,在多线程场景下,由于时间片切换的原因,原子性问题可能会出现。在Java内存模型中,所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中使用到的变量的主内存副本拷贝。原创 2023-07-25 06:41:46 · 1455 阅读 · 0 评论 -
Java中 notify/notifyAll、run/start、wait/sleep、有啥区别
wait()方法是Object类中定义的一个方法,它的作用是使当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法唤醒它。在消费者线程中,调用message.consume()方法消费消息,并通过notifyAll()方法唤醒等待中的生产者和消费者线程。在生产者线程中,调用message.produce()方法生产消息,并通过notify()方法唤醒等待中的消费者线程。在Java中,notify和notifyAll是用于线程间通信的方法,用于唤醒等待中的线程。原创 2023-08-19 19:01:06 · 272 阅读 · 0 评论 -
Java中 线程安全、并发与并行、进程与线程、共享变量、类变量、成员变量、局部变量的详细解释
并发(Concurrent)在操作系统中是指在同一时间段内有多个程序在同一个处理器上运行,这些程序都已经启动但尚未运行完毕。为了实现并发,操作系统采用了🎯分时操作系统🎯的方式。无论是Windows、Linux还是MacOS,都是多用户多任务的分时操作系统。这意味着多个用户可以同时进行多个任务。然而,在单个CPU的计算机中,✨实际上同一时间只能执行一项任务✨。为了实现看上去的“同时执行多个任务”,操作系统将CPU时间划分为基本相同的时间片,并通过操作系统管理,依次轮流分配这些时间片给不同的用户。原创 2023-07-23 09:41:27 · 4201 阅读 · 0 评论 -
Java8 Stream 使用详解
Java 8引入了Stream流的概念,它是对集合对象(Collection)进行操作的高级抽象。Stream流的操作分为两种:中间操作和终端操作。中间操作是指在流上进行的操作,返回的仍然是一个流,可以进行链式操作,而终端操作是指对流的最终操作,返回的是一个结果或者一个副作用。Stream流的特点如下:Stream流是对集合对象的一种封装,使得可以用函数式编程的方式对集合进行操作。Stream流的操作是延迟执行的,只有在终端操作时才会触发执行。原创 2023-07-12 06:51:28 · 1578 阅读 · 0 评论 -
CopyOnWriteArrayList使用以及原理分析
CopyOnWriteArrayList是Java中的一种并发集合类,它实现了List接口,并且是线程安全的。它的特点是在进行写操作时,会创建一个新的副本来进行操作,而不是直接修改原有的集合。CopyOnWriteArrayList的实现机制是在写操作时,先将原有的集合进行复制,然后对新的副本进行修改操作,最后将修改后的副本替换原有的集合。这样可以保证在写操作时不会影响到正在进行读操作的线程,保证了读写的并发性。原创 2023-07-12 06:48:44 · 1147 阅读 · 0 评论 -
一文读懂synchronized的使用与原理
今天我们要聊一聊Java中的一个重要的关键字——synchronized。原创 2023-07-11 08:26:55 · 118 阅读 · 0 评论 -
CompletionService的基本使用以及原理
CompletionService是Java并发编程中的一个工具类,它实现了一个任务完成的队列,并且可以按照任务完成的顺序来获取任务的结果。CompletionService的主要作用是提供一种方式来处理一批并发执行的任务,并且在它们完成后按照完成的顺序获取结果。它通常与ExecutorService一起使用。使用CompletionService可以将一组任务提交给ExecutorService去执行,并且通过调用CompletionService的take()方法来获取已经完成的任务的结果。原创 2023-07-10 06:05:09 · 1839 阅读 · 0 评论 -
Disruptor的使用以及原理
Disruptor是一种高性能的并发框架,用于解决在高并发场景下的数据交换和协调问题。通过无锁的环形缓冲区和批量处理的方式,实现了更高的吞吐量和更低的延迟。它适用于需要处理大量并发事件的场景,如高频交易系统、消息队列等。原创 2023-07-07 06:45:29 · 3403 阅读 · 0 评论 -
AtomicInteger使用详解
AtomicInteger是Java中提供的一种线程安全的原子操作类,用于在多线程环境下对整数进行原子操作。原创 2023-07-06 07:02:34 · 2980 阅读 · 0 评论 -
CAS的使用以及底层原理
CAS(Compare and Swap)是一种无锁操作,通过比较内存中的值与预期值是否相等来实现原子操作,解决并发环境下的数据竞争问题。原创 2023-07-06 07:02:02 · 1805 阅读 · 0 评论 -
ForkJoinPool的使用以及基本原理
Fork/Join框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。使用Fork/Join框架可以简化并发任务的编写和调度,提高并行任务的执行效率。它适用于那些可以被划分成多个独立子任务并且子任务之间没有依赖关系的情况。通过将大任务分割成小任务并使用Fork/Join框架执行,可以充分利用多核处理器的性能,提高程序的并发能力。原创 2023-07-04 06:38:32 · 2028 阅读 · 0 评论 -
CompletableFuture使用详解
CompletableFuture是Java 8中新增的一个类,它实现了CompletionStage接口和Future接口。CompletionStage接口是对Future接口的扩展,提供了更多的功能和灵活性。CompletableFuture提供了一系列的方法,用于处理异步任务的结果。它可以让任务在后台线程中执行,并且可以通过回调函数来处理任务的结果。这种异步的方式可以提高程序的性能,避免阻塞主线程。除了异步执行,CompletableFuture还提供了流式处理的能力。原创 2023-07-03 06:39:45 · 2196 阅读 · 1 评论 -
Java中的阻塞队列使用以及详解
阻塞队列原创 2023-07-02 09:22:31 · 2387 阅读 · 0 评论 -
CountDownLatch基本使用及原理
CountDownLatch是一个线程同步工具类,它可以让一个或多个线程等待其他线程完成某个任务后再继续执行。它通过一个计数器来实现,计数器的初始值可以设置为一个正整数,每当一个线程完成任务后,计数器的值就会减1,当计数器的值变为0时,所有等待的线程就会被唤醒。AbstractQueuedSynchronizer是一个用于构建锁和同步器的基类,它提供了一个框架,供子类重写并实现自己的同步逻辑。AQS内部维护了一个FIFO的等待队列,用于管理等待获取锁的线程,并提供了一些方法供子类操作这个队列。原创 2023-07-01 08:12:02 · 3184 阅读 · 0 评论 -
AQS之Semaphore详解
AQS为Semaphore提供了基本的针对共享资源的获取失败入队出队阻塞唤醒的逻辑。Semaphore通过AQS的同步状态来表示可用的许可数,并通过AQS的等待队列来管理等待获取许可的线程。当一个线程请求获取许可时,如果许可数不足,则该线程会被阻塞并加入到AQS的等待队列中。当有其他线程释放许可时,AQS会从等待队列中选择一个线程唤醒,使其重新尝试获取许可。这样就实现了对共享资源的获取失败入队出队阻塞唤醒的逻辑。原创 2023-06-30 08:36:53 · 5306 阅读 · 0 评论 -
AQS之ReentrantLock详解
AbstractQueuedSynchronizer提供了一个同步器的框架,可以基于它来实现各种锁和同步器。它是ReentrantLock的基础实现,ReentrantLock中的锁和同步器都是基于AbstractQueuedSynchronizer来实现的。在实现锁和同步器时,需要继承AbstractQueuedSynchronizer类,并实现它的一些抽象方法。AbstractQueuedSynchronizer的主要作用如下:2.1 提供了一个同步器的框架,可以基于它来实现各种锁和同步器。原创 2023-06-25 15:44:41 · 7563 阅读 · 0 评论 -
Java集合之LinkedList详解
例如containsAll、removeAll、retainAll等方法,这些方法可以被ArrayList直接继承和使用,从而避免了重复实现这些操作。同时,AbstractCollection也提供了一些抽象方法,例如size、iterator、toArray等方法,这些方法需要由具体的集合类去实现,LinkedList也需要实现这些方法以完成自身的功能。AbstractList是List接口的一个抽象实现,实现了List接口的大部分方法,包括添加、删除、获取元素、遍历等。原创 2023-06-25 13:10:13 · 1442 阅读 · 0 评论 -
Java集合之ArrayList详解
Java集合之ArrayList详解原创 2023-06-22 17:50:36 · 2270 阅读 · 0 评论 -
如何优雅的停止一个线程之Java中断
Java中断机制原创 2023-01-08 17:34:57 · 2277 阅读 · 0 评论 -
JAVA并发之对AQS的一点理解
JAVA并发之谈谈你对AQS的理解原创 2022-11-27 00:20:43 · 805 阅读 · 0 评论