SCJP题库详解:优先队列与Java多线程同步机制

需积分: 9 0 下载量 85 浏览量 更新于2024-09-08 收藏 806KB DOC 举报
在SCJP考试题库中,我们关注了Java集合框架中的一个重要数据结构——PriorityQueue(优先队列)。PriorityQueue是一个基于堆实现的无界队列,当不指定Comparator时,默认使用最小堆。这意味着元素会被按照它们的自然顺序或者自定义比较器进行排序,队列头部总是存储具有最小值的元素。 队列操作包括: 1. **添加元素**:可以使用`add(E e)`方法添加元素到队列尾部,堆的性质保证了元素的排序。 2. **移除元素**:`poll()`方法用于移除并返回队首的元素,如果队列为空则返回`null`;`peek()`方法则返回队首元素但不移除,同样处理空队列的情况。 3. **容量管理**:PriorityQueue支持初始容量设置,且容量会根据需要自动扩展。 关于`synchronized`关键字,这是Java中的同步控制机制,确保多线程环境下数据的可见性和一致性。它可以用在以下几个场景: - 修饰代码块:作为锁定资源的同步机制,如`synchronized(this) {}` - 修饰方法:确保方法执行时互斥,如`public synchronized void method() {}` - 修饰静态方法或类:控制对共享资源的并发访问,如`public static synchronized void staticMethod() {}` 私有静态成员和公共静态成员的区别在于: - 私有静态成员(private static)只能由本类的静态方法访问,外部类或对象不能直接访问。 - 公共静态成员(public static)除了允许本类静态方法和实例方法访问外,还可以通过类名直接调用,以及由外部创建的对象调用。 最后,讨论了线程的启动方式: - `start()`方法用于启动新线程,执行`Runnable`接口的`run()`方法,这是一种异步执行,符合线程并发的初衷。 - 相比之下,直接调用`run()`方法(如`new Thread().run()`)虽然也能启动线程,但由于是在主线程中执行,没有利用多线程的优势,不具备异步执行的特点。 在数组的使用上,题库提到了一个示例,展示了如何声明但未初始化数组,如`static { x = new int[5]; x[0] = 1; }`,这表明数组在声明后需要明确分配空间和初始化,否则可能导致未定义的行为。