
多线程
文章平均质量分 50
langzilige
java搬运工
展开
-
【volatile 是如何保证可见性的呢?】
volatile 是如何保证可见性的多线程如:volatile instance = new instance();示例代码中, instance 被volatile修饰。 上边的new操作, 转化成汇编代码如下:as10x.…;lock…有volatile变量修饰的共享变量进行写操作的时候会多出第二行Lock汇编代码, Lock前缀的指令在多核 处理器下会引发了两件事情:1) 将当前处理器缓存行的数据写回到系统内存。 (volatile写的内存语义)2) 这个写回内存的操作会使在其他CPU里原创 2022-04-13 22:34:01 · 247 阅读 · 0 评论 -
Java中如何正确停止一个线程
这个问题在面试过程中或者是实际开发中可能都会遇到,那么我们怎么正确停止一个线程呢?首先说说stop命令,不是说它的好,而是不能使用stop,stop不安全,导致程序异常不安全的,执行时会导致对象被破坏。所以这个方法被弃用了。你应该中断一个线程而不是停止他可以使用的中断线程方法,我们应该保证线程被执行完再中断,其源码中也有注释说明,调用stop()终止一个线程会释放它已经锁定的所有监视器(这将导致沿堆栈向上传播为检查的ThreadDeath异常被抛出),若此时之前受这些被释放的监视器保护的对象存在不一致原创 2022-04-11 23:31:01 · 1257 阅读 · 0 评论 -
【线程中的 join方法和yeild方法区别】
说说 在项目实践中经常会遇到一个场景, 就是需 要等待某几件事情完成后才能继续往下执 行, 比如多个线程加载资源, 需要等待多 个线程全部加载完毕再汇总处理,或者顺序执行某些线程。1Thread 类中有一个join 方法就可以做这个事情, j oin方法是Thread 类直接提供的。join 是无 参且返回值为void 的方法。2 Thread 类中有一个静态的yield 方法, 当一个线程调用yield 方法时, 实际就是在暗示线程调度器当前 线程请求让出自己的CPU 使用。 我们知道操作系统是为每原创 2022-04-11 22:22:40 · 925 阅读 · 0 评论 -
阻塞队列实现原理
1.阻塞队列实现原理阻塞队列与普通队列的区别在于,阻塞队列提供了可阻塞的put和take方法。如果队列是空的,消费者使用take方法从队列中获取数据就会被阻塞,直到队列有数据可用;当队列是满的,生产者使用put方法向队列里添加数据就会被阻塞,直到队列中数据被消费有空闲位置可用2.JUC提供了7种适合与不同应用场景的阻塞队列。1)ArrayBlockingQueue:基于数组实现的有界阻塞队列。2)LinkedBlockingQueue:基于链表实现的有界阻塞队列。3)PriorityBlocki原创 2022-04-10 15:52:36 · 3133 阅读 · 0 评论 -
AQS同步队列实现
Abstract-QueuedSynchronizer是一个抽象同步类,简称AQS。它是实现JUC中绝大部分同步工具的核心组件,都是基于AQS构建的,我们熟知的lock,底层都是通过aqs来实现的AQS提供了一套通用的机制来管理同步状态、阻塞/唤醒线程、管理等待队列等#AQS实现原理AQS维护同步队列,内部使用一个FIFO的双向链表,管理线程同步时的所有被阻塞线程。双向链表这种数据结构,它的每个数据节点中都有两个指针,分别指向直接后继节点和直接前驱节点。所以,从双向链表中的任意一个节点开始,都可以很原创 2022-04-05 10:12:52 · 562 阅读 · 0 评论 -
CounDownLatch介绍
这里写自定义目录标题CounDownLatchCounDownLatch1简介countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue2.CounDownLatch具体是干什么用的,有什么ApicountDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过维护一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器原创 2020-10-17 17:42:18 · 540 阅读 · 0 评论 -
线程池的创建和使用(总结1)
线程池的创建和使用1创建线程池的7个参数一般我们推荐使用ThreadPoolExecutor()自定义创建线程池,因为这比较灵活切可控。int corePoolSize 核心线程数,即确定有多少个核心线程。int maximumPoolSize 最大线程数,即限定线程池中的最大线程数量。long keepAliveTime 非核心线程的存活时间,配合下面的TimeUnit参数确定时间。TimeUnit unit 一个时间类型的枚举类。有从纳秒到天的时间量度,配合上面的keepAliveTim原创 2020-06-24 16:12:52 · 322 阅读 · 0 评论