Over a million developers have joined DZone.

yield(), sleep(0), wait(0,1) and parkNanos(1)

· Java Zone

What every Java engineer should know about microservices: Reactive Microservices Architecture.  Brought to you in partnership with Lightbend.

On the surface these methods do the same thing in Java; Thread.yield(), Thread.sleep(0), Object.wait(0,1) and LockSupport.parkNanos(1) They all wait a sort period of time, but how much that is varies a surprising amount and between platforms.

Timing a short delay

The following code times how long it takes to repeatedly call those methods.
import java.util.concurrent.locks.LockSupport;

public class Pausing {
    public static void main(String... args) throws InterruptedException {
        int repeat = 10000;
        for (int i = 0; i < 3; i++) {
            long time0 = System.nanoTime();
            for (int j = 0; j < repeat; j++)
                Thread.yield();
            long time1 = System.nanoTime();
            for (int j = 0; j < repeat; j++)
                Thread.sleep(0);
            long time2 = System.nanoTime();
            synchronized (Thread.class) {
                for (int j = 0; j < repeat/10; j++)
                    Thread.class.wait(0, 1);
            }
            long time3 = System.nanoTime();
            for (int j = 0; j < repeat/10; j++)
                LockSupport.parkNanos(1);
            long time4 = System.nanoTime();

            System.out.printf("The average time to yield %.1f μs, sleep(0) %.1f μs, " +
                    "wait(0,1) %.1f μs and LockSupport.parkNanos(1) %.1f μs%n",
                    (time1 - time0) / repeat / 1e3, (time2 - time1) / repeat / 1e3, 
                    (time3 - time2) / (repeat/10) / 1e3, (time4 - time3) / (repeat/10) / 1e3);
        }
    }
}

On Windows 7

The average time to yield 0.3 μs, sleep(0) 0.6 μs, wait(0,1) 999.9 μs and LockSupport.parkNanos(1) 1000.0 μs
The average time to yield 0.3 μs, sleep(0) 0.6 μs, wait(0,1) 999.5 μs and LockSupport.parkNanos(1) 1000.1 μs
The average time to yield 0.2 μs, sleep(0) 0.5 μs, wait(0,1) 1000.0 μs and LockSupport.parkNanos(1) 1000.1 μs

On RHEL 5.x

The average time to yield 1.1 μs, sleep(0) 1.1 μs, wait(0,1) 2003.8 μs and LockSupport.parkNanos(1) 3.8 μs
The average time to yield 1.1 μs, sleep(0) 1.1 μs, wait(0,1) 2004.8 μs and LockSupport.parkNanos(1) 3.4 μs
The average time to yield 1.1 μs, sleep(0) 1.1 μs, wait(0,1) 2005.6 μs and LockSupport.parkNanos(1) 3.1 μs

In summary

If you want to wait for a short period of time, you can't assume that all these methods do the same thing, nor will be the same between platforms.

Microservices for Java, explained. Revitalize your legacy systems (and your career) with Reactive Microservices Architecture, a free O'Reilly book. Brought to you in partnership with Lightbend.

Topics:

Published at DZone with permission of Peter Lawrey, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}