java并发
文章平均质量分 50
wzt2012s
这个作者很懒,什么都没留下…
展开
-
⾼并发下异步请求解决⽅案
方式一:@Async组件应⽤实战1.问题由于发送短信涉及到⽹络通信, 因此sendMessage⽅法可能会有⼀些延迟. 为了改善⽤户体验, 我们可以使⽤异步发送短信的2.⽅法异步任务:异步调⽤是相对于同步调⽤⽽⾔的。同步调⽤:是指程序按预定顺序⼀步步执⾏,每⼀步必须等到上⼀步执⾏完后才能执⾏。1)异步调⽤则⽆需等待上⼀步程序执⾏完即可执⾏多线程就是⼀种实现异步调⽤的⽅式2)MQ也是⼀种宏观上的异步3.使⽤场景1)适⽤于处理log、发送邮件、短信……等2)涉及到⽹络IO调⽤等操原创 2021-12-05 13:24:51 · 482 阅读 · 0 评论 -
Java中的ThreadLocal详解
一、ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。 ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一...原创 2021-11-16 17:51:22 · 267 阅读 · 0 评论 -
ForkJoinPool 的适用场景,实现原理
原文:https://blog.csdn.net/f641385712/article/details/83749798本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码。ForkJoinPool 结论:ForkJoinPool 不是为了替代 ExecutorService,而是它的补充,在某些应用场景下性能比 ExecutorService 更好。ForkJoinPool 主要用于实现“分而治之”的算法,特别是分治之后递归调用的函数,例如 quick sort转载 2021-05-17 16:25:01 · 627 阅读 · 0 评论 -
非静态方法的锁默认为 this, 静态方法的锁为 对应的 Class 实例
非静态方法的锁默认为 this, 静态方法的锁为 对应的 Class 实例题目:判断打印的 "one" or "two" ?1. 两个普通同步方法,两个线程,标准打印, 打印? //one two2. 新增 Thread.sleep() 给 getOne() ,打印? //one two3. 新增普通方法 getThree() , 打印? //three one two4. 两个普通同步方法,两个 Number 对象,打印? //two one5. 修改 getO...原创 2021-05-17 11:00:31 · 87 阅读 · 0 评论 -
ReadWriteLock : 读写锁
1. ReadWriteLock : 读写锁写写/读写 需要“互斥”读读 不需要互斥import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class TestReadWriteLock { public static void main(String[] args) { ReadWriteLockDemo rw ..原创 2021-05-17 10:42:27 · 91 阅读 · 0 评论 -
线程之间的通信
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/* * 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。 * 如:ABCABCABC…… 依次递归 */public class.原创 2021-05-17 10:39:49 · 58 阅读 · 0 评论 -
生产者消费者案例2_lock实现
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/* * 生产者消费者案例: */public class TestProductorAndConsumerForLock { public static void main(String[] args) { Clerk cl.原创 2021-05-17 08:47:09 · 53 阅读 · 0 评论 -
生产者和消费者案例1
/* * 生产者和消费者案例 */public class TestProductorAndConsumer { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor pro = new Productor(clerk); Consumer cus = new Consumer(clerk); new Thread(.原创 2021-05-17 08:28:37 · 75 阅读 · 0 评论 -
线程创建的四种方式
java中创建线程的四种方法以及区别Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程4)使用线程池例如用Executor框架下面让我们分别来看看这四种创建线程的方法。------------------------继承Thread类创建线程---------------------.转载 2021-05-16 22:49:38 · 11401 阅读 · 1 评论 -
并发容器类
Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对与多线程的操作,介于 HashMap 与 Hashtable 之间。内部采用“锁分段”机制替代 Hashtable 的独占锁。进而提高性能。此包还提供了设计用于多线程上下文中的 Collection 实现:ConcurrentHashMap、 ConcurrentSkipListMap、 Co.原创 2021-05-16 22:23:03 · 67 阅读 · 0 评论 -
模拟 CAS 算法
import org.junit.Test;/* * 模拟 CAS 算法 */public class TestCompareAndSwap { @Test public void test(String[] args) { final CompareAndSwap cas = new CompareAndSwap(); for (int i = 0; i < 10; i++) { new Thread(new Runna.原创 2021-05-16 22:04:57 · 78 阅读 · 0 评论 -
操作原子性
import java.util.concurrent.atomic.AtomicInteger;import org.junit.Test;/* * 一、i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” * int i = 10; * i = i++; //10 * * int temp = i; * temp = i + 1; * i = temp; * * 二、原子.原创 2021-05-16 21:52:39 · 93 阅读 · 0 评论 -
volatile 关键字
/* * 一、volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。 * 相较于 synchronized 是一种较为轻量级的同步策略。 * * 注意: * 1. volatile 不具备“互斥性” * 2. volatile 不能保证变量的“原子性” */public class TestVolatile { @Test public void test() { ThreadDemo td =.原创 2021-05-16 21:42:08 · 67 阅读 · 0 评论