【死磕Java并发】—–J.U.C之阻塞队列:PriorityBlockingQueue (cmsblogs.com)

【简介】

我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? PriorityBlockingQueue 。

PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采用自然顺序升序排序,当然我们也可以通过构造函数来指定Comparator来对元素进行排序。需要注意的是PriorityBlockingQueue不能保证同优先级元素的顺序。

点击查看原文 >>

@技术头条 2017-08-21 13:39 / 0个评论
赞过的人: @技术头条
要不要再学学下面的文章?
sqlite并发读写的演进之路 (www.codedump.info)
本文梳理sqlite并发读写方案的演进之路。
by @技术头条 2024-03-21 23:26 查看详情
以非阻塞方式执行一个函数 (blog.codingnow.com)
用过 skynet 的应该都碰到过:当我们在服务中不小心调用了一个长时间运行而不返回的 C 函数,会独占一个工作线程。同时,这个被阻塞的服务也无法处理新的消息。一旦这种情况发生,看似是无解的。我们通常认为,是设计问题导致了这种情况发生。skynet 的框架在监测到这种情况发生时,会输出 maybe in an endless loop 。

如果是 Lua 函数产生的死循环,可以通过发送 signal 打断正在运行运行的 Lua 虚拟机,但如果是陷入 C 函数中,只能事后追查 bug 了。

那么,如果我原本就预期一段 C 代码会运行很长时间,有没有可能从底层支持以非阻塞方式运行这段代码呢?即,在这段代码运行期间,该服务还可以接收并处理新的消息?
by @技术头条 2024-03-13 13:20 查看详情
Java SPI机制学习与常用框架SPI案例 (l1n.wang)
SPI(Service ProviderInterface)是JDK内置的服务提供机制,常用于框架的动态扩展,类似于可拔插机制。提供方将接口实现类配置在classpath下的指定位置,调用方读取并加载。当提供方发生变化时,接口的实现也会改变。Java生态中JDK、Dubbo、Spring等都通过SPI提供了动态扩展的能力。
by @技术头条 2024-01-17 23:19 查看详情
解析Java动态代理机制的实现 (l1n.wang)
代理模式主要是Proxy对原始方法做了一层包装,用以增加一些新的统一处理逻辑,来增强目标对象的功能。静态代理是传统设计模式中一种传统的实现方案,动态代理能将代理对象的创建延迟到程序运行阶段。
by @技术头条 2024-01-17 23:16 查看详情
高效I/O并发处理:双缓冲和Exchanger (colobu.com)
双缓冲(double buffering)是高效处理I/O操作的一种并发技术,它使用两个buffer,一个goroutine使用其中一个buffer进行写,而另一个goroutine使用另一个buffer进行读,然后进行交换。这样两个goroutine可能并发的执行,减少它们之间的等待和阻塞。

本文还提供了一个类似Java的java.util.concurrent.Exchanger的Go并发原语,它可以用来在两个goroutine之间交换数据,快速实现双缓冲的模式。 这个并发原语可以在github.com/smallnest/exp/sync/Exchanger找到。
by @技术头条 2024-01-17 23:05 查看详情
Go运行时的并发原语 (colobu.com)
这篇文章我们来了解一下隐藏在Go运行时中的一些并发原语, 因为运行时是底座和包循环依赖等原因,运行时中很少使用标准库中的并发原语,它有自己的并发原语。
by @技术头条 2024-01-14 19:07 查看详情
Java ZGC 调优 (www.diguage.com)
本篇文章讨论了 ZGC 的各种 JVM 调整参数,旨在优化其在 Java 应用程序中的性能。通过利用这些调整选项,开发人员可以对 ZGC 进行微调,以根据其特定需求提供最佳性能。此外,仔细分析 GC 日志和监控 ZGC 的行为可以为了解其性能特征提供有价值的信息。通过尝试使用这些调整参数并密切监控 GC 日志,开发人员可以释放 ZGC 的全部潜能,并确保其 Java 应用程序中的垃圾回收效率。
by @技术头条 2024-01-14 18:58 查看详情
Go单线程运行也会有并发问题 (colobu.com)
一个Go大佬群中严肃的讨论了一个问题:Go程序单线程多goroutine访问一个map会遇到并发读写panic么?

答案是肯定的,因为出现了这个问题所以大家才在群中讨论。

为什么呢?因为单线程意味着并行单元只有一个(多线程也可能并行单元只有一个),但是多goroutine意味着并发单元有多个,如果并发单元同时执行,即使是单线程,可能就会产生数据竞争的问题,除非这些goroutine是顺序执行的。
by @技术头条 2023-12-11 23:04 查看详情
Rust并发编程番外篇: Mutex内部实现 (colobu.com)
Mutex是最常用的一种同步原语,它提供了互斥锁的功能,多线程可以互斥访问共享数据以及通过锁保护临界区。Rust标准库提供了Mutex的实现,接下来我们看看它是怎么实现的。
by @技术头条 2023-11-06 22:56 查看详情
Rust并发编程 - 容器类并发原语 (colobu.com)
Rust 在并发编程方面有一些强大的原语,让你能够写出安全且高效的并发代码。最显著的原语之一是 ownership system,它允许你在没有锁的情况下管理内存访问。此外,Rust 还提供了一些并发编程的工具和标准库,比如线程、线程池、消息通讯(mpsc等)、原子操作等,不过这一章我们不介绍这些工具和库,它们会专门的分章节去讲。这一章我们专门讲一些保证在线程间共享的一些方式和库。

并发原语内容较多,分成两章,这一章介绍Cow、beef::Cow、Box、 Cell、RefCell、OnceCell、LazyCell、LazyLock 和 Rc。 我把它们称之为容器类并发原语,主要基于它们的行为,它们主要是对普通数据进行包装,以便提供其他更丰富的功能。
by @技术头条 2023-10-24 23:56 查看详情