
- •Contents at a Glance
- •Contents
- •About the Authors
- •About the Technical Reviewer
- •Acknowledgments
- •Introduction
- •Oracle Java Certifications: Overview
- •FAQ 1. What are the different levels of Oracle Java certification exams?
- •FAQ 4. Is OCPJP 7 prerequisite for other Oracle certification exams?
- •FAQ 5. Should I take the OCPJP 7 or OCPJP 6 exam?
- •The OCPJP 7 Exam
- •FAQ 7. How many questions are there in the OCPJP 7 exam?
- •FAQ 8. What is the duration of the OCPJP 7 exam?
- •FAQ 9. What is the cost of the OCPJP 7 exam?
- •FAQ 10. What are the passing scores for the OCPJP 7 exam?
- •FAQ 11. What kinds of questions are asked in the OCPJP 7 exam?
- •FAQ 12. What does the OCPJP 7 exam test for?
- •FAQ 13. I’ve been a Java programmer for last five years. Do I have to prepare for the OCPJP 7 exam?
- •FAQ 14. How do I prepare for the OCPJP 7 exam?
- •FAQ 15. How do I know when I’m ready to take the OCPJP 7 exam?
- •Taking the OCPJP 7 Exam
- •FAQ 16. What are my options to register for the exam?
- •FAQ 17. How do I register for the exam, schedule a day and time for taking the exam, and appear for the exam?
- •The OCPJP 7 Exam: Pretest
- •Answers with Explanations
- •Post-Pretest Evaluation
- •Essentials of OOP
- •FunPaint Application: An Example
- •Foundations of OOP
- •Abstraction
- •Encapsulation
- •Inheritance
- •Polymorphism
- •Class Fundamentals
- •Object Creation
- •Constructors
- •Access Modifiers
- •Public Access Modifier
- •Private Access Modifier
- •Protected and Default Access Modifier
- •Overloading
- •Method Overloading
- •Constructor Overloading
- •Overload resolution
- •Points to Remember
- •Inheritance
- •Runtime Polymorphism
- •An Example
- •Overriding Issues
- •Overriding: Deeper Dive
- •Invoking Superclass Methods
- •Type Conversions
- •Upcasts and Downcasts
- •Casting Between Inconvertible Types
- •Using “instanceof” for Safe Downcasts
- •Java Packages
- •Working with Packages
- •Static Import
- •Summary
- •Abstract Classes
- •Points to Remember
- •Using the “final” Keyword
- •Final Classes
- •Final Methods and Variables
- •Points to Remember
- •Using the “static” Keyword
- •Static Block
- •Points to Remember
- •Flavors of Nested Classes
- •Static Nested Classes (or Interfaces)
- •Points to Remember
- •Inner Classes
- •Points to Remember
- •Local Inner Classes
- •Points to Remember
- •Anonymous Inner Classes
- •Points to Remember
- •Enum Data Types
- •Points to Remember
- •Summary
- •Interfaces
- •Declaring and Using Interfaces
- •Points to Remember
- •Abstract Classes vs. Interfaces
- •Choosing Between an Abstract Class and an Interface
- •Object Composition
- •Composition vs. Inheritance
- •Points to Remember
- •Design Patterns
- •The Singleton Design Pattern
- •Ensuring That Your Singleton Is Indeed a Singleton
- •The Factory Design Pattern
- •Differences Between Factory and Abstract Factory Design Patterns
- •The Data Access Object (DAO) Design Pattern
- •Points to Remember
- •Summary
- •Generics
- •Using Object Type and Type Safety
- •Using the Object Class vs. Generics
- •Container Implementation Using the Object Class
- •Container Implementation Using Generics
- •Creating Generic Classes
- •Diamond Syntax
- •Interoperability of Raw Types and Generic Types
- •Generic Methods
- •Generics and Subtyping
- •Wildcard Parameters
- •Limitations of Wildcards
- •Bounded Wildcards
- •Wildcards in the Collections Class
- •Points to Remember
- •The Collections Framework
- •Why Reusable Classes?
- •Basic Components of the Collections Framework
- •Abstract Classes and Interfaces
- •Concrete Classes
- •List Classes
- •ArrayList Class
- •The ListIterator Interface
- •The LinkedList Class
- •The Set Interface
- •The HashSet Class
- •The TreeSet Class
- •The Map Interface
- •The HashMap Class
- •Overriding the hashCode() Method
- •The NavigableMap Interface
- •The Queue Interface
- •The Deque Interface
- •Comparable and Comparator Interfaces
- •Algorithms (Collections Class)
- •The Arrays Class
- •Methods in the Arrays Class
- •Array as a List
- •Points to Remember
- •Summary
- •Generics
- •Collections Framework
- •Processing Strings
- •String Searching
- •The IndexOf() Method
- •The regionMatches() Method
- •String Parsing
- •String Conversions
- •The Split() Method
- •Regular Expressions
- •Understanding regex Symbols
- •Regex Support in Java
- •Searching and Parsing with regex
- •Replacing Strings with regex
- •String Formatting
- •Format Specifiers
- •Points to Remember
- •Summary
- •Reading and Writing from Console
- •Understanding the Console Class
- •Formatted I/O with the Console Class
- •Special Character Handling in the Console Class
- •Using Streams to Read and Write Files
- •Character Streams and Byte Streams
- •Character Streams
- •Reading Text Files
- •Reading and Writing Text Files
- •“Tokenizing” Text
- •Byte Streams
- •Reading a Byte Stream
- •Data Streams
- •Writing to and Reading from Object Streams: Serialization
- •Serialization: Some More Details
- •Points to Remember
- •Summary
- •A Quick History of I/O APIs
- •Using the Path Interface
- •Getting Path Information
- •Comparing Two Paths
- •Using the Files Class
- •Checking File Properties and Metadata
- •Copying a File
- •Moving a File
- •Deleting a File
- •Walking a File Tree
- •Revisiting File Copy
- •Finding a File
- •Watching a Directory for Changes
- •Points to Remember
- •Summary
- •Introduction to JDBC
- •The Architecture of JDBC
- •Two-Tier and Three-Tier JDBC Architecture
- •Types of JDBC Drivers
- •Setting Up the Database
- •Connecting to a Database Using a JDBC Driver
- •The Connection Interface
- •Connecting to the Database
- •Statement
- •ResultSet
- •Querying the Database
- •Updating the Database
- •Getting the Database Metadata
- •Points to Remember
- •Querying and Updating the Database
- •Performing Transactions
- •Rolling Back Database Operations
- •The RowSet Interface
- •Points to Remember
- •Summary
- •Define the Layout of the JDBC API
- •Connect to a Database by Using a JDBC driver
- •Update and Query a Database
- •Customize the Transaction Behavior of JDBC and Commit Transactions
- •Use the JDBC 4.1 RowSetProvider, RowSetFactory, and RowSet Interfaces
- •Introduction to Exception Handling
- •Throwing Exceptions
- •Unhandled Exceptions
- •Try and Catch Statements
- •Programmatically Accessing the Stack Trace
- •Multiple Catch Blocks
- •Multi-Catch Blocks
- •General Catch Handlers
- •Finally Blocks
- •Points to Remember
- •Try-with-Resources
- •Closing Multiple Resources
- •Points to Remember
- •Exception Types
- •The Exception Class
- •The RuntimeException Class
- •The Error Class
- •The Throws Clause
- •Method Overriding and the Throws Clause
- •Points to Remember
- •Custom Exceptions
- •Assertions
- •Assert Statement
- •How Not to Use Asserts
- •Summary
- •Introduction
- •Locales
- •The Locale Class
- •Getting Locale Details
- •Resource Bundles
- •Using PropertyResourceBundle
- •Using ListResourceBundle
- •Loading a Resource Bundle
- •Naming Convention for Resource Bundles
- •Formatting for Local Culture
- •The NumberFormat Class
- •The Currency Class
- •The DateFormat Class
- •The SimpleDateFormat Class
- •Points to Remember
- •Summary
- •Introduction to Concurrent Programming
- •Important Threading-Related Methods
- •Creating Threads
- •Extending the Thread Class
- •Implementing the Runnable Interface
- •The Start( ) and Run( ) Methods
- •Thread Name, Priority, and Group
- •Using the Thread.sleep() Method
- •Using Thread’s Join Method
- •Asynchronous Execution
- •The States of a Thread
- •Two States in “Runnable” State
- •Concurrent Access Problems
- •Data Races
- •Thread Synchronization
- •Synchronized Blocks
- •Synchronized Methods
- •Synchronized Blocks vs. Synchronized Methods
- •Deadlocks
- •Other Threading Problems
- •Livelocks
- •Lock Starvation
- •The Wait/Notify Mechanism
- •Let’s Solve a Problem
- •More Thread States
- •timed_waiting and blocked States
- •waiting State
- •Using Thread.State enum
- •Understanding IllegalThreadStateException
- •Summary
- •Using java.util.concurrent Collections
- •Semaphore
- •CountDownLatch
- •Exchanger
- •CyclicBarrier
- •Phaser
- •Concurrent Collections
- •Apply Atomic Variables and Locks
- •Atomic Variables
- •Locks
- •Conditions
- •Multiple Conditions on a Lock
- •Use Executors and ThreadPools
- •Executor
- •Callable, Executors, ExecutorService, ThreadPool, and Future
- •ThreadFactory
- •The ThreadLocalRandom Class
- •TimeUnit Enumeration
- •Use the Parallel Fork/Join Framework
- •Useful Classes of the Fork/Join Framework
- •Using the Fork/Join Framework
- •Points to Remember
- •Summary
- •Using java.util.concurrent Collections
- •Applying Atomic Variables and Locks
- •Using Executors and ThreadPools
- •Using the Parallel Fork/Join Framework
- •Chapter 3: Java Class Design
- •Chapter 4: Advanced Class Design
- •Chapter 5: Object-Oriented Design Principles
- •Chapter 6: Generics and Collections
- •Chapter 7: String Processing
- •Chapter 8: Java I/O Fundamentals
- •Chapter 9: Java File I/O (NIO.2)
- •Chapter 10: Building Database Applications with JDBC
- •Chapter 11: Exceptions and Assertions
- •Chapter 12: Localization
- •Chapter 13: Threads
- •Chapter 14: Concurrency
- •OCPJP7 Exam (1Z0-804 a.k.a. Java SE 7 Programmer II) Topics
- •OCPJP 7 Exam (1Z0-805, a.k.a. Upgrade to Java SE 7 Programmer) Topics
- •Answers and Explanations
- •Answer Sheet
- •Answers and Explanations
- •Index

Chapter 14 ■ Concurrency
5.In your application, there is a producer component that keeps adding new items to a fixed-size queue; the consumer component fetches items from that queue. If the queue is full, the producer has to wait for items to be fetched; if the queue is empty, the consumer has to wait for items to be added.
Which one of the following utilities is suitable for synchronizing the common queue for concurrent use by a producer and consumer?
A. RecursiveAction
B. ForkJoinPool C. Future
D. Semaphore
E. TimeUnit
Answer:
D. Semaphore
(The question is a classic producer–consumer problem that can be solved by using semaphores. The objects of the synchronizer class java.util.concurrent.Semaphore can be used to guard the common queue so that the producer and consumer can synchronize their access to the queue. Of the given options, semaphore is the only synchronizer; other options are unrelated to providing synchronized access to a queue.
Option A) RecursiveAction supports recursive ForkJoinTask, and option B) ForkJoinPool provides help in running a ForkJoinTask in the context of the Fork/Join framework. Option C) Future represents the result of an asynchronous computation whose result will be “available in the future once the computation is complete.” Option E) TimeUnit is an enumeration that provides support for different time units such as milliseconds, seconds, and days.)
Summary
Using java.util.concurrent Collections
•A semaphore controls access to shared resources. A semaphore maintains a counter to specify number of resources that the semaphore controls.
•CountDownLatch allows one or more threads to wait for a countdown to complete.
•The Exchanger class is meant for exchanging data between two threads. This class is useful when two threads need to synchronize between each other and continuously exchange data.
•CyclicBarrier helps provide a synchronization point where threads may need to wait at a predefined execution point until all other threads reach that point.
•Phaser is a useful feature when few independent threads have to work in phases to complete a task.
482
Chapter 14 ■ Concurrency
Applying Atomic Variables and Locks
•Java provides an efficient alternative in the form of atomic variables where one needs to acquire and release a lock just to carry out primitive operations on variables.
•A lock ensures that only one thread accesses a shared resource at a time.
•A Condition supports thread notification mechanism. When a certain condition is not satisfied, a thread can wait for another thread to satisfy that condition; that other thread could notify once the condition is met.
Using Executors and ThreadPools
•The Executors hierarchy abstracts the lower-level details of multi-threaded programming and offers high-level user-friendly concurrency constructs.
•The Callable interface represents a task that needs to be completed by a thread. Once the task completes, the call() method of a Callable implementation returns a value.
•A thread pool is a collection of threads that can execute tasks.
•Future represents objects that contain a value that is returned by a thread in the future.
•ThreadFactory is an interface that is meant for creating threads instead of explicitly creating threads by calling a new Thread().
Using the Parallel Fork/Join Framework
•The Fork/Join framework is a portable means of executing a program with decent parallelism.
•The framework is an implementation of the ExecutorService interface and provides an easy-to-use concurrent platform in order to exploit multiple processors.
•This framework is very useful for modeling divide-and-conquer problems.
•The Fork/Join framework uses the work-stealing algorithm: when a worker thread completes its work and is free, it takes (or “steals”) work from other threads that are still busy doing some work.
•The work-stealing technique results in decent load balancing thread management with minimal synchronization cost.
•ForkJoinPool is the most important class in the Fork/Join framework. It is a thread pool for running fork/join tasks—it executes an instance of ForkJoinTask. It executes tasks and manages their lifecycles.
•ForkJoinTask<V> is a lightweight thread-like entity representing a task that defines methods such as fork() and join().
483

Chapter 15
OCPJP 7 Quick Refresher
This chapter provides a quick summary to important points to remember from the OCPJP 7 exam perspective. A summarized list of exam tips is also compiled to help you prepare for the exam. Read this chapter the day before taking the exam. Good luck!
Exam Tips
•Most questions in the OCPJP 7 exam are about predicting the behavior of the program. In our experience taking the exam, we found that if we read the question and immediately start looking at the answers, the answers confused us in many cases (leading us
to selecting the wrong answer!). To avoid this confusion, we suggest an alternative approach: first understand the question and arrive at an answer, and then check the options to see if there is a matching answer. This is especially important for questions related to pattern matching (in regex, glob, etc.); if you look at the answers first, they can often mislead you to choosing the wrong answer!
•Questions in the OCPJP 7 exam clearly mention the number of correct options that you should select for a given question. The exam software will not warn you if you choose only one option for a question that requires selecting multiple answers and vice versa.
So, beware of this pitfall, and ensure that you select only the exact number of answers as explicitly mentioned for each question.
•While taking the OCPJP 7 exam, you can mark the question to revisit later if you’re not sure of the answer. The exam software provides a check box at the top right side of the screen.
•There are many questions in the exam that are long or time-consuming. If you’re taking too long to read or answer a particular question, mark it for revisiting later.
•Many of the questions ask you to predict the behavior of a program, and most of the options will provide possible output with one of the options mentioning that the prgoram will result in a compiler error (without giving the specific compiler error). It is a common mistake to be “optimistic” and assume that the program will compile without errors! For example, you know that you will get a compiler error if you try to instantiate an abstract class; however, in a question that presents you a 20-25 lines program, it is easy to miss an attempt to instantiate an abstract class if you directly look at the list of answers. To avoid this pitfall, we recommend that you first look for possible compiler errors in the program before checking other options relating to the output of the program.
485

Chapter 15 ■ OCPJP 7 Quick Refresher
•Look out for potential exceptions that the program can throw before looking at the answers. For example, check if the program could result in an
IllegalThreadStateException for the program relating to thread state transition. Similarly, programs that perform downcasts without checking the type first can result in a ClassCastException. Yes, it is obvious, but in our experience in taking the exam, we found that it was easy to miss out on such common runtime exceptions when answering the questions.
•There are many APIs in which arguments are passed to specify the range. For example, the subpath(int beginIndex, int endIndex) method in the Path interface takes beginIndex and endIndex as arguments. In this case, note that beginIndex is the index of the first name element, inclusive of itself, and endIndex is the index of the last name element, exclusive of itself. In other words, in most Java APIs methods that specify a range (such as the nextInt() method in Random), the first argument is inclusive and the second argument is exclusive. When answering a question whose answer depends on the range, and when you don’t know if the arguments are inclusive or not, an educated guess would be to treat the first argument as inclusive and the second argument as exclusive!
•In questions involving assertions, the question will mention if assertions are enabled or disabled by mentioning if the –ea or –da option is passed in the command line (if it is not explicitly mentioned, remember that the assertions are disabled in a program by default). Answer questions about the behavior of the program, keeping in mind whether assertions are enabled or disabled.
•For questions relating to passing null to APIs, do not always assume that the API will throw a NullPointerException. For example, the add() method in ArrayList accepts null arguments and does not throw a NullPointerException. In general, while reviewing the behavior of methods in the Java library, give a special attention to the corner cases and the exceptions that the methods can throw.
•While reviewing APIs, understand the differences between similar looking classes or methods (for example, similarities and differences between the Comparable and Comparator interfaces).
•When predicting the output of the programs relating to threads and concurrency, give special attention to how thread scheduling and thread interleaving can affect the output.
•When taking the exam, you may be given an erasable scribble board. You may find it handy for answering certain kinds of questions. For example, we recommend that you to quickly draw the class relationships on the board for selecting the correct option(s) for questions relating to class relationships (such as is-a and has-a relationships).
Chapter 3: Java Class Design
•You cannot access the private methods of the base class in the derived class.
•You can access the protected method from a class in the same package (just like package private or default) as well as a derived class (even belonging to another package).
•You can have overloaded constructors. You can call a constructor of the same class in another constructor using the this keyword.
486