PriorityQueue有一个特征需要特别注意,即:对于那些通过排序方法判定为“相等”的元素,在通过poll方法依次取出它们时,它们的顺序是不确定的,特别是不会维持插入的顺序。举例说明:假如一个对象Obj,有a,b两个字段,如果Obj对象是按字段a由小到大进行排序的,当向队列依次插入a,b分别为:(1,1),(2,1),(1,2),(2,2),(1,3)的五个元素时,通过poll方法从队头依次取出的元素会是什么呢?首先,一定可以确定的是(1,1),(1,2),(1,3)一定会排在前面,(2,1),(2,2)一定会排在后面,问题在于(1,1),(1,2),(1,3)之间和(2,1),(2,2)之间是如果排序的,习惯上我们希望它们保留插入时的顺序,但是实际上,在PriorityQueue在进行内部排序时,它们的原始插入顺序都被破坏了,所以实际的输出时,相等元素之间的顺序是不确定的。以下是一段验证程序:

import java.util.*;

public class Test1 {

public static void main(String[] args) {

PriorityQueue q = new PriorityQueue();

q.add(new Obj(1,1));

q.add(new Obj(2,1));

q.add(new Obj(1,2));

q.add(new Obj(2,2));

q.add(new Obj(1,3));

int size = q.size();

for (int i = 0; i < size; i++) {

System.out.println(q.poll());

}

System.out.println("--------------------------");

List l = new ArrayList();

l.add(new Obj(1, 1));

l.add(new Obj(2, 1));

l.add(new Obj(1, 2));

l.add(new Obj(2, 2));

l.add(new Obj(1, 3));

Collections.sort(l);

for (Obj obj : l) {

System.out.println(obj);

}

}

public static class Obj implements Comparable {

int a;

int b;

public Obj(int a, int b) {

this.a = a;

this.b = b;

}

@Override

public String toString() {

return "Obj{" +

"a=" + a +

", b=" + b +

‘}‘;

}

@Override

public int compareTo(Obj o) {

return a - o.getA();

}

public int getA() {

return a;

}

public void setA(int a) {

this.a = a;

}

public int getB() {

return b;

}

public void setB(int b) {

this.b = b;

}

}

}

程序的输出是:

Obj{a=1, b=1}

Obj{a=1, b=3}

Obj{a=1, b=2}

Obj{a=2, b=2}

Obj{a=2, b=1}

--------------------------

Obj{a=1, b=1}

Obj{a=1, b=2}

Obj{a=1, b=3}

Obj{a=2, b=1}

Obj{a=2, b=2}

请注意前半段使用PriorityQueue,(1,1),(1,2),(1,3)三者的实际顺序是:(1,1),(1,3),(1,2)。 而使用排序方法排序得到的是我们期望的顺序。这就是PriorityQueue在排序上的一个微妙的地方。

原文:http://blog.csdn.net/yusiguyuan/article/details/20215591

linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件相关推荐

  1. Linux多线程编程四(条件变量)

    2019独角兽企业重金招聘Python工程师标准>>> 前一节中我们讲述了如何使用互斥锁来实现线程间数据的共享和通信,互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定.而条件变量通 ...

  2. c++11 多线程编程(六)------条件变量(Condition Variable)

    互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...

  3. Linux操作系统下的多线程编程详细解析----条件变量pthread_cond_t那些事儿

    推荐两个博文: http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html http://blog.csdn.net/sunboy_2 ...

  4. Linux操作系统下的多线程编程详细解析----条件变量

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁(Mutex)的不足. 1.初始化条件变量pthread_cond_init #include <pthread.h> ...

  5. c++11多线程编程同步——使用条件变量condition variable

    简述 在多线程编程中,当多个线程之间需要进行某些同步机制时,如某个线程的执行需要另一个线程完成后才能进行,可以使用条件变量. c++11提供的 condition_variable 类是一个同步原语, ...

  6. linux条件变量唤醒丢失,多线程编程精髓(三)

    本篇主要讲Linux环境下的多线程同步内核对象. (1)linux线程同步之互斥体:linux互斥体的用法与windows的临界区对象类似,使用数据结构 pthread_mutex_t表示互斥体对象( ...

  7. linux c多进程多线程,linux下的C\C++多进程多线程编程实例详解

    linux下的C\C++多进程多线程编程实例详解 1.多进程编程 #include #include #include int main() { pid_t child_pid; /* 创建一个子进程 ...

  8. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  9. Linux系统编程---17(条件变量及其函数,生产者消费者条件变量模型,生产者与消费者模型(线程安全队列),条件变量优点,信号量及其主要函数,信号量与条件变量的区别,)

    条件变量 条件变量本身不是锁!但它也可以造成线程阻塞.通常与互斥锁配合使用.给多线程提供一个会合的场所. 主要应用函数: pthread_cond_init 函数 pthread_cond_destr ...

最新文章

  1. 30个 Web 设计者 必备的免费 PSD UI 工具包
  2. WebRTC 系列之视频辅流
  3. MySQL数据库的可视化管理工具连接时一些问题解决~
  4. DBA日常工作内容和职责
  5. javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第3部分
  6. 【LeetCode - 1254】统计封闭岛屿的数目(dfs,连通块)
  7. 如何唤醒计算机,待机后如何唤醒计算机?介绍睡眠待机的优势
  8. 六时出行 App 隐私政策
  9. (28)System Verilog设计UART发送
  10. java integer == int_通过实例了解Java Integer类和int的区别
  11. java merge_java – OptimisticLockException当使用JPA merge()
  12. SQL Server安装程序–数据库警报
  13. 【转】VC动态内存分配PPT
  14. 软工课设第一周周四报告
  15. FISCO BCOS源码(4)第三方依赖和模块
  16. 轻松让Ubunt虚拟机访问windows宿主机(本地硬盘)
  17. RxJava:concat(连接)、 concatDelayError、 concatEager的使用
  18. 搭建阿里云服务器内有阿里云幸运券
  19. F28335中断系统
  20. 2022大淘宝技术工程师推荐书单

热门文章

  1. PyTorch框架学习八——PyTorch数据读取机制(简述)
  2. Libcurl的介绍
  3. MSE和Cross-entropy梯度更新比较
  4. DL中常用的numpy
  5. 吴恩达斯坦福大学机器学习 CS229 课程学习笔记(一)
  6. scrapy学习笔记(二)进阶使用
  7. 22条API设计的实践
  8. Effective Java~38. 用接口模拟可扩展的enum
  9. ajax将响应结果显示到iframe,JavaScript:iframe / Ajax / JSON
  10. ApkTool2.34 打包经验