Question

I am trying to learn multi-threading in java. I wrote this sample code, to get a random number and exit if the number is positive integer. Here I am using synchronized just to check how it works. Since the method gererateRandom() is synchronized my expectation is that only one thread is allowed to go inside the function. Although there is no shared variable I am just checking how it works.

The program is working fine, but what I am expecting is, as the thread gets a positive number it should exit the program and other threads should be blocked. But the result I am getting is completely different. Please check the result section below the code.

import java.util.Random;

public class CheckNumbnerThread implements Runnable{

Thread t;
int n ;
CheckNumbnerThread() {
      t = new Thread(this);
      System.out.println("Child thread: " + t);
      t.start(); // Start the thread
   }

@Override
public void run() {
    gererateRandom();
}

public synchronized int gererateRandom(){
    Random rn = new Random();
    n = rn.nextInt() % 100;
    System.out.println("The random number generated is " + n);
    if (n > 0){
        System.exit(0);
    }

    return n;       
} 
}

public class DemoThread {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    int counter = 0;
    while(true){
        new CheckNumbnerThread();
        counter++;
        System.out.println("Thread counter " + counter);

    }
}
}

Child thread: Thread[Thread-0,5,main] Thread counter 1 Child thread: Thread[Thread-1,5,main] The random number generated is 79 Thread counter 2 Child thread: Thread[Thread-2,5,main] The random number generated is 27 Thread counter 3 Child thread: Thread[Thread-3,5,main] The random number generated is -7 Thread counter 4 Child thread: Thread[Thread-4,5,main] The random number generated is -68 Thread counter 5 Child thread: Thread[Thread-5,5,main] The random number generated is 20 Thread counter 6 Child thread: Thread[Thread-6,5,main] The random number generated is 67 Thread counter 7 Child thread: Thread[Thread-7,5,main] The random number generated is 13 Thread counter 8 Child thread: Thread[Thread-8,5,main] The random number generated is 56 Thread counter 9 Child thread: Thread[Thread-9,5,main] The random number generated is 93

But what I expected is that it should stop execution after printing:

Child thread: Thread[Thread-0,5,main] Thread counter 1 Child thread: Thread[Thread-1,5,main] The random number generated is 79

Was it helpful?

Solution

Your synchronized applies to the instance of that thread only and will not prevent the method running in parallel on multiple threads like your code does. If you want to synchronize on all instances, synchronize on class.

synchronized (CheckNumbnerThread.class) {
    n = rn.nextInt() % 100
    // ...
}

OTHER TIPS

that's not the idea. since you've synchronized the method gererateRandom(), what you're assuring is that no more than one thread will execute this method at the same time.

but since there's no restriction for this method execution, what is happening is that all your threads will just wait for their time to execute this method, but all of them will be executed.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top