JUC
老罗爱java
热爱技术,热爱生活,热爱运动。
展开
-
通过Callable接口实现多线程
通过Callable接口实现多线程 import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; class MyThread implements Callable<Integer> { @Override public Integer call() throws Exception { System.out.println(Thread.currentThread原创 2021-02-09 16:31:39 · 122 阅读 · 0 评论 -
java线程池详解
java线程池详解 七大参数 四种拒绝策略 类型 描述 AbortPolicy 直接抛出RejectedException异常阻止系统正常运行 CallerRunsPolicy ”调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。 DiscardOldestPolicy 抛弃队列中等待最久对的任务,然后把当前任务加入队列中尝试再次提交当前任务。 DiscardPolicy 直接丢弃任务,不予任何处理也不抛出异常,如原创 2021-02-08 16:58:45 · 91 阅读 · 1 评论 -
手写生产者消费者模式
手写生产者消费者模式 简述 利用volatile+CAS+BlockingQueue,写一个简单版生产者消费者Demo。 参考尚硅谷阳哥的视频,感谢大佬! 实践 package com.lly.test; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concur原创 2021-02-05 17:32:20 · 142 阅读 · 0 评论 -
BlockingQueue之常用类型Demo
BlockingQueue之常用类型Demo 七大类型的Demo用法 是我自己在学习的时候写的笔记,仅供参考。 代码如下: package com.lly.test; import org.junit.jupiter.api.Test; import java.util.concurrent.*; public class BlockingQueueDemo { @Test public void test_ArrayBlockingQueue() { // 由数组结构原创 2021-02-05 16:53:25 · 260 阅读 · 1 评论 -
BlockingQueue学习
BlockingQueue学习 什么是阻塞队列? 线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素。 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。 当阻塞队列是满时,往队列里添加元素的操作将会被阻塞。 为什么用?有什么好处? 在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动唤醒。 为什么需要BlockingQueue 好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了。 在conc原创 2021-02-04 08:57:20 · 2195 阅读 · 6 评论 -
Semaphore学习
Semaphore学习 理论 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。 实践 举例: 抢车位,6辆车抢3个车位 import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class SemaphoreDemo { public static void main(String[] args) { // 模拟3个停车位原创 2021-02-02 14:00:27 · 114 阅读 · 1 评论 -
ReentrantLock之Condition用法
ReentrantLock之Condition用法 题目 题目:多线程之前按顺序调用,实现A->B->C三个线程启动,要求如下: A打印5次,B打印10次,C打印15次 紧接着 A打印5次,B打印10次,C打印15次 … 来5轮 Demo package com.lly.test; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * 线程操作资原创 2021-02-02 09:18:38 · 5703 阅读 · 7 评论 -
CyclicBarrier学习
CyclicBarrier学习 理论 CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。 实践 举例: 集齐7颗龙珠才能召唤神龙 public class CyclicBarrierDemo { public static void main(String原创 2021-02-01 16:34:36 · 81 阅读 · 1 评论 -
CountDownLatch学习
CountDownLatch学习 理论 CountDownLatch主要有2个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒,继续执行。 实践 以生活中的case,进行举例。 5个同学上完晚自习,班长最后锁门。 代码如下: public class CountDownLatchDemo { public static void原创 2021-02-01 09:52:34 · 124 阅读 · 0 评论 -
ArrayList线程安全问题解决
ArrayList线程安全问题解决 问题现象 多个线程操作同一个list会出现并发修改异常(java.util.ConcurrentModificationException) 测试代码如下: public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i < 30; i++) { new Thread(() -&g原创 2021-01-29 10:23:08 · 391 阅读 · 7 评论 -
CAS算法学习
CAS算法学习 概念 CAS就是compareAndSwap的缩写,一句话描述:比较并交换。是一个轻量级的同步机制. CAS算法涉及到3个操作数: 需要读写的内存值V 进行比较的值A 需要更新的值B 怎么使用 以AtomicInteger类进行说明 public class CASDemo { public static void main(String[] args) { // 初始值为1 AtomicInteger atomicInteger = new A原创 2021-01-28 09:04:08 · 244 阅读 · 0 评论