
多线程
悠然~
生命不息,学习不止。好记性不如烂笔头
展开
-
ThreadLocal详解
ThreadLocal本质上,ThreadLocal通过空间来换取时间,从而实现每个线程当中都会有一个变量的副本,这样每个线程就会操作改副本,从而完全规避了多线程的并发问题。 public T get() { // 获取到当前线程对象 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { Thread原创 2020-07-30 14:12:59 · 186 阅读 · 0 评论 -
Java的Future模式
Future接口的作用Future表示异步计算的结果。 提供了一些方法来检查计算是否完成,等待其完成以及检索计算结果。 只有在计算完成时才可以使用get方法检索结果,必要时将其阻塞,直到准备就绪为止。 取消由cancel方法执行。 提供了其他方法来确定任务是正常完成还是被取消。 一旦计算完成,就不能取消计算。 如果出于可取消性的目的而使用Future而不提供可用的结果,则可以声明Future <?>形式的类型,并作为基础任务的结果返回null。Future接口提供的方法 // 取消任原创 2020-07-29 13:43:44 · 204 阅读 · 0 评论 -
CAS详解
CAS详解synchronized关键字与Lock等锁机制都是悲观锁:无论做何种操作,首先都需要上锁,接下来再去执行后续操作,从而确保了接下来所有的操作都是由当前线程来执行的。乐观锁:线程在操作之前不做任何预先的处理,而是直接去执行;当在最后执行变量更新的时候,当前线程需要有一种机制来确保当前被操作的变量是没有被其他线程修改的;CAS是乐观锁的一种极为重要的实现方式。CAS(Compare And Swap)比较与交换:这是一个不断循环的过程,一直到变量值被修改成功为止。CAS本身是由硬件指令来原创 2020-07-28 16:02:16 · 369 阅读 · 0 评论 -
CyclicBarrier使用场景
CyclicBarrier应用场景实现了若干个线程都到达了某一个具体的点,这些线程再同时开始执行。没有主次之分当所有线程都到达屏障之后,所有的线程开始执行原创 2020-07-28 13:32:58 · 1076 阅读 · 0 评论 -
CountDownLatch使用场景
CountDownLatch使用场景主程序等待所有子程序执行完成后再执行。若计数器的数量大于子线程的数量,即计数器没有减到0,则线程一直处于await状态。package com.learn.thread.countdown;import java.util.concurrent.CountDownLatch;import java.util.stream.IntStream;public class CountDownTest { public static void main(原创 2020-07-27 16:06:58 · 226 阅读 · 0 评论 -
volatile关键字详解
volatile关键字主要有三方面的作用实现long/double类型变量的原子性防止指令重排序实现变量的可见性原创 2020-07-23 15:30:41 · 313 阅读 · 0 评论 -
Condition详解
Condition详解传统上,我们可以同个synchronized关键字 + wait + notify/notifyAll 来实现多个线程之间的协调与通信,整个过程都是由JVM来帮助我们实现的;开发者无需(也无法)了解底层的细节。从JDK 1.5开始,并发包提供了Lock,Condition(await与signal/signalAll)来实现多个线程之间的协调与通信,整个过程都是开发者来控制的,而且相比于传统方式,更加灵活,功能也更加强大。Condition newCondition()返回一个绑原创 2020-07-22 14:09:21 · 1886 阅读 · 0 评论 -
Java Lock详解
Lock锁机制详解Lock锁方法详解Lock与synchronized关键字的区别原创 2020-07-21 17:09:07 · 828 阅读 · 0 评论 -
死锁与相关检测工具
死锁死锁、活锁与饿死死锁线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源,两个线程都无法继续执行。活锁线程持续重试一个总是失败的操作,导致无法继续执行。饿死线程一直被调度器延迟访问其赖以执行的资源,也许是调度器先于低优先级的线程而执行高优先级的线程,同时总是会有一个高优先级的线程可以执行,饿死也叫做无限延迟。package com.learn.thread.deadlock;public class DeadLockTest { private Obje原创 2020-07-21 14:34:47 · 262 阅读 · 0 评论 -
synchronized关键字原理学习
synchronized关键字原理学习synchronized关键字原理详解如果一个对象有若干个synchronized方法,在某一时刻,只能有唯一的一个线程去进入到其中一个synchronized方法,其他的线程要去访问其他synchronized方法,也需要等待。 因为要尝试获取对象锁,当前对象只有一把锁。当一个类中有一个synchronized static方法时,线程进入这个方法时,获取到的锁不是当前对象的锁,而是当前对象对应class 的锁。package com.learn.thre原创 2020-07-17 15:00:49 · 266 阅读 · 0 评论 -
多线程wait()与notify()和notifyAll()方法的总结
多线程wait()与notify()和notifyAll()方法的总结wait和sleep的区别在调用wait方法时,线程必须持有调用对象的锁,当调用wait方法后,线程就会释放掉改对象的锁(monitor)。在调用wait方法时,线程必须持有调用对象的锁,当调用wait方法后,线程就会释放掉改对象的锁(monitor)。在调用Thread类的sleep方法时,线程是不会释放掉对象的锁的。wait()与notify()和notifyAll()方法的总结当调用wait时,首先需要确保原创 2020-07-16 15:49:57 · 526 阅读 · 0 评论 -
Java并发容器-ConcurrentLinkedQueue
Java并发容器-ConcurrentLinkedQueue概述简介示例代码概述马老师多线程视频学习总结(好记性不如烂笔头)。Java并发容器-ConcurrentLinkedQueue学习。简介实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,阻塞队列就是通过使用加锁的阻塞算法实现的;另一种非阻塞的实现方式则可以使用循环CAS(比较并交换)的方式来实现。ConcurrentL...原创 2019-03-07 19:28:44 · 323 阅读 · 0 评论 -
Java线程池学习和使用
CopyOnWriteArrayList实现原理概述概述马老师多线程视频学习总结(好记性不如烂笔头)。CopyOnWriteArrayList学习使用。原创 2019-03-08 14:28:03 · 256 阅读 · 0 评论 -
DelayQueue实现原理
DelayQueue实现原理概述DelayQueue使用概述马老师多线程视频学习总结(好记性不如烂笔头)。CopyOnWriteArrayList学习使用。DelayQueue使用DelayQueue可以用来执行定时任务package com.wz.code.test.thread.queue;import java.util.concurrent.BlockingQueue;im...原创 2019-03-08 14:30:18 · 796 阅读 · 0 评论 -
SynchronousQueue实现原理
SynchronousQueue实现原理概述概述马老师多线程视频学习总结(好记性不如烂笔头)。SynchronousQueue学习使用。原创 2019-03-08 14:31:03 · 261 阅读 · 0 评论 -
LinkedTransferQueue实现原理
LinkedTransferQueue实现原理概述概述马老师多线程视频学习总结(好记性不如烂笔头)。LinkedTransferQueue学习使用。原创 2019-03-08 14:31:26 · 287 阅读 · 0 评论 -
创建线程的方式
初识java多线程概述初识多线程线程的两种创建方式多线程会出现的线程不安全问题认识synchronized和volatile关键字java线程抽象内存模型volatile关键字的作用synchronized关键字的作用volatile关键字和synchronized关键字的区别概述马老师多线程视频学习总结(好记性不如烂笔头)。初识多线程线程的两种创建方式继承Thread类和实现Runna...原创 2019-03-07 11:07:21 · 289 阅读 · 0 评论 -
多线程之间通信
多线程之间通信概述多线程之间通信使用volatile实现通信使用synchronized,wait,notify/notifyAllCountDownLatch实现线程间通信概述马老师多线程视频学习总结(好记性不如烂笔头)。多线程之间通信使用volatile实现通信模拟情形: 设计一个容器,两个线程。线程一给容器里面add元素,当容器中的元素个数为5个时,线程二结束。未使用volati...原创 2019-03-07 14:42:00 · 169 阅读 · 0 评论 -
Java并发辅助类CountDownLatch、CyclicBarrier和 Semaphore
Java并发辅助类CountDownLatch、CyclicBarrier和 Semaphore概述CountDownLatch用法CyclicBarrier用法Semaphore用法总结概述马老师多线程视频学习总结(好记性不如烂笔头)。CountDownLatch用法CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个...转载 2019-03-07 16:12:38 · 182 阅读 · 0 评论 -
Java多线程实现售票
Java多线程实现售票概述线程不安全线程安全概述马老师多线程视频学习总结(好记性不如烂笔头)。Java多线程实现售票。线程不安全package com.wz.code.test.thread;import java.util.ArrayList;import java.util.List;public class TicketSeller1 { static List&...原创 2019-03-07 17:10:14 · 1440 阅读 · 0 评论 -
Java并发容器-ConcurrentHashMap
Java并发容器-ConcurrentHashMap概述源码实现初始化put操作初始化数组initTable链表转红黑树: treeifyBin扩容:tryPresize数据迁移:transferget 过程分析概述马老师多线程视频学习总结(好记性不如烂笔头)。Java并发容器-ConcurrentHashMap学习。源码实现初始化初始化容量大小sizeCtl = 【 (1.5 * in...转载 2019-03-07 18:04:59 · 254 阅读 · 0 评论 -
Java阻塞队列-ArrayBlockingQueue和LinkedBlockingQueue
Java阻塞队列-ArrayBlockingQueue和LinkedBlockingQueue阻塞队列ArrayBlockingQueue的基本使用put操作初始化数组initTable链表转红黑树: treeifyBin扩容:tryPresize数据迁移:transferget 过程分析示例程序阻塞队列阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点...转载 2019-03-08 14:05:06 · 255 阅读 · 0 评论