多线程
文章平均质量分 78
Strong_shady
这个作者很懒,什么都没留下…
展开
-
多线程-ThreadLocal由浅入深--boy next door♂
1.简介 是个啥: ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。 做啥的: 实现每一个线程都有自己专属的本地变量副本(自己用自己的变量不麻烦别人,不和其他人共享,人人有份,人各一份), 主要解决了让每个线程绑定自己的值,通过使用get()和set()方法,原创 2021-09-23 12:25:35 · 191 阅读 · 0 评论 -
多线程-Synchronized、AtomicLong、LongAdder、LongAccumulate性能对比及LongAdder简介
class ClickNum{ int number = 0; public synchronized void addInSynchr(){ number++; } AtomicLong atomicLong =new AtomicLong(); public void addInAtomicLong(){ atomicLong.incrementAndGet(); } LongAdder longAdder =原创 2021-09-22 13:36:43 · 213 阅读 · 0 评论 -
多线程-卖票案例--手写自旋锁--解决CAS版本号偷换问题
public class SpinLock { AtomicReference<Thread> atomicReference = new AtomicReference<>(); public void myLock(){ System.out.println(Thread.currentThread().getName()+"----come in"); while(!atomicReference.compareAnd原创 2021-09-19 16:51:40 · 175 阅读 · 0 评论 -
多线程05-LockSupport--JMM内存模型(三大特性&happens-before原则)
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程 1.三种让线程等待和唤醒的方法: 1.使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程 2.使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程 3.LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程 1.1Object中的wait()方法原创 2021-09-15 12:16:59 · 163 阅读 · 0 评论 -
多线程04-公平锁-可重入锁&死锁-中断(如何优雅停止线程)
1.公平&非公平 1.1卖票案例(非公平) class Ticket { private int number = 50; private Lock lock = new ReentrantLock(); //默认用的是非公平锁,若想分配的平均一点,=--》公平一点,就构造器参数改为true public void sale() { lock.lock(); try { if(number >原创 2021-09-13 23:47:47 · 211 阅读 · 0 评论 -
多线程03-synchronized锁深入研究01
悲观锁/乐观锁: 悲观:操作时不让其他线程进入干预。synchronized、lock 乐观:其他线程可以干预。参考版本号机制、CAS 1.八锁现象–锁静态时/锁方法时 1.0 标准访问俩线程,先打印Email后打印SMS: class Phone{ public synchronized void sendEmail(){ System.out.println("-----sendEmail"); } public synchronized void send原创 2021-09-04 10:31:39 · 117 阅读 · 0 评论 -
多线程02-CompletableFuture深入
CompletableFuture可以做future做的事 CompletableFuture优点: 1.异步任务结束时,自动回调某个对象的方法; 2.异步任务出错时,自动回调某个对象的方法; 3.主线程设置好回调后,不再关心异步任务的执行,异步任务之间可以顺序执行。 多线程异步调用/异步编排(减少阻塞及轮询): public static void main(String[] args) throws ExecutionException, InterruptedException { T原创 2021-09-03 12:35:46 · 1351 阅读 · 3 评论 -
线程并发2. 集合类 & 锁
四、我们知道ArrayList是线程不安全的,请编写一个不安全的案例并给出解决方案 HashSet与ArrayList一致 HashMap HashSet底层是一个HashMap,存储的值放在HashMap的key里,value存储了一个PRESENT的静态Object对象 1、线程不安全 /** * 集合类不安全问题 * ArrayList */ public class ContainerNotSafeDemo { public static void main(String[] args原创 2021-01-18 22:37:00 · 139 阅读 · 2 评论 -
线程并发3. CountDownLatch/CyclicBarrier/Semaphore & 阻塞队列
★★★六、CountDownLatch/CyclicBarrier/Semaphore用过吗 1、CountDownLatch(火箭发射倒计时/秦灭六国一统华夏) 它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行 CountDownLatch主要有两个方法,当一个或多个线程调用await()方法时,调用线程会被阻塞。其他线程调用countDown()方法会将计数器减1,当计数器的值变为0时,因调用awa原创 2021-01-18 22:51:58 · 191 阅读 · 0 评论 -
线程并发5.解读AQS
1.前置知识(待完善) LockSuppor LockSupport是用来创建锁和其他同步类的基本线程阻塞原语 LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有对应的唤醒方法。归根 结底,LockSupport调用的Unsafe中的native代码。 LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞的过程 LockSupport和每个使用它的线程都有一个许可(permit)关联。permit相当于1,0的开关,默原创 2021-01-28 19:13:21 · 125 阅读 · 3 评论