Friday, April 27, 2018

Volatile in java

public class SharedObject {
// Changes made to SharedObject in one thread may not be
// immediately reflect in other thread
static int sharedVariable = 8;
}

/**
 * Suppose two threads are working on SharedObject. If two threads run on
 * different processes each thread may have its own local copy of
 * sharedVariable. If one thread modifies its value the changes might not
 * reflect in the original one in the main memory instantly.
 * 
 */

public class SharedObject {
// Changes made to SharedObject in one thread may not be
// immediately reflect in other thread
static volatile int sharedVariable = 8;
}

Explanation: here changes made by one thread to shared data are visible to other threads.

import java.util.logging.Level;
import java.util.logging.Logger;

public class VolatileExe {
private static final Logger LOGGER = Logger.getLogger(VolatileExe.class.getName());

private static volatile int MY_INT = 0;

public static void main(String[] args) {
new ChangeListener().start();
new ChangeMaker().start();
}

static class ChangeListener extends Thread {
@Override
public void run() {
int local_value = MY_INT;
while (local_value < 5) {
if (local_value != MY_INT) {
LOGGER.log(Level.INFO, "Got Change for MY_INT : {0}", MY_INT);
local_value = MY_INT;
}
}
}
}

static class ChangeMaker extends Thread {
@Override
public void run() {

int local_value = MY_INT;
while (MY_INT < 5) {
LOGGER.log(Level.INFO, "Incrementing MY_INT to {0}", local_value + 1);
MY_INT = ++local_value;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

No comments:

Post a Comment

How to run standalone mock server on local laptop

 Please download the standalone wiremock server from Direct download section at the bottom of the page.  Download and installation Feel fre...