tongmutou tongmutou - 1 year ago 88
Java Question

Thread is always running, can't stop

I want to make a test, two thread, one thread is changing the value, another thread use a while to wait the first thread, and then break and finish.But the question is the waiting thread is always running, can' stop any more. Another question is when i open the code of "System.out.println(i + " run");", all the thread can work normally, it's so strange.

import java.util.Date;

public class ThreadTestTwo {
public int a = 0, b = 0,c = 0;

public static void main(String[] args) {
System.out.println(new Date()+"start");
for (int i = 0; i < 100000; i++) {
new ThreadTestTwo().start(i);
if(i % 100000 == 0){
System.out.println(new Date()+"finish");

public void start(final int i){
Thread readThread = new Thread(){
public void run() {
while (true) {
if(c == 1){
b = a;
// System.out.println(i+", set b "+a);
// System.out.println(i + " run");
Thread writeThread = new Thread(){
public void run() {
a = 1;
c = 1;
System.out.println(i+" start");

try {
} catch (InterruptedException e) {
System.out.println(i+" end");
if(b != 1)
throw new RuntimeException("b = "+b);


Answer Source

The writes of one thread are NOT guaranteed to be seen for another thread unless the variables are marked as volatile or otherwise the transactions need to handled using synchronization or explicit locking

In your case, a,b,c are the instance variables accessed by multiple threads and the reader thread caches the values and so it doesn't see the writer thread's flushed value.

Please refer the below link for more details:

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download