Defect - Thread Busy Waiting


Defect - Thread Busy Waiting

Busy waiting is that one thread is active, but doing nothing, just continuously polling some condition, It’s "busy" in as the thread is still executed by the processor, even though the thread is accomplishing nothing but waiting for something. This actually "steals" processor cycles away from other threads.

Busy-waiting can greatly increase the load on the processor, reducing the amount of useful work that other processes can accomplish on the same machine.


In Java, busy waiting can be avoided by any shared object used as a notification mechanism. The waiting thread simply waits (suspends itself temporarily) until the other thread notifies it that it’s done.


For example:

public class CheckRemoteNodeAliveThread extends Thread {

    private HashSet nodeInfoSet = new HashSet();

    private volatile boolean running;

 

    public void checkNodeAlive(RemoteNodeInfo remoteNodeInfo) {

       synchronized (nodeInfoSet) {

           nodeInfoSet.add(remoteNodeInfo);

           // at first, no code below

           // nodeInfoSet.notifyAll();

       }

    }

    public void run() {

       running = true;

       HashSet clonedSet;

       while (running) {

           RemoteNodeInfo remoteNodeInfo = null;

           try {

              // operate on cloned set

              synchronized (nodeInfoSet) {

                  // at first, I forgot to add the following logic, and this would cause busy-wait,

                  // when there are no node in nodeInfoSet, the thread is still continuously poll nodeInfoSet state

                  // while (nodeInfoSet.isEmpty()) {

                  //  nodeInfoSet.wait();

                  // }

                  clonedSet = (HashSet) nodeInfoSet.clone();

                  nodeInfoSet.clear();

              }

              Iterator it = clonedSet.iterator();

              while (it.hasNext()) {

                  // logic to check whether remote node is running

              }

           } catch (Exception e) {

              //this thread is expected to run always, so capture all exception, and do some recover steps

              e.printStackTrace();

           }

       }

    }

}



Resources:
Effective Java (2nd Edition)
Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)