FULL PRODUCT VERSION :
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Server VM (build 16.3-b01, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
SunOS adapp4-apandey2 5.10 Generic_142910-17 i86pc i386 i86pc Solaris
A DESCRIPTION OF THE PROBLEM :
Using a counter in a while loop where the loop exit condition is like
public void run()
{
while(true)
{
int count = 0;
while(counter++ < Integer.MAX_VALUE)
{......}
}
}
This breaks the while loop after a few runs. After a few runs, the while loop exits after the first run itself
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Running the code attached and following the comments will reproduce the issue. After a few runs, count will show 1 always and q.size will keep on increasing because queue reader does not consume all while the writer keeps on adding the messages to the queue.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expected result - queue reader consumes all messages in the queue.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
mport java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by IntelliJ IDEA.
* User: archit.pandey
* Date: Sep 29, 2011
* Time: 10:23:20 PM
* Bug Testcase for while loop breaking when Integer.MAX_VALUE is used as a breaking condition from the loop.
* Using a counter in a while loop where the loop exit condition is like
*
* public void run()
* {
* while(true)
* {
* int count = 0;
* while(counter++ < Integer.MAX_VALUE)
* {......}
* }
* }
*
* This breaks the while loop after a few runs. After a few runs, the while loop exits after the first run itself
*/
public class TestQBreak {
//executors for running queue reader and writers
private static ScheduledExecutorService readerSvc = Executors.newSingleThreadScheduledExecutor();
private static ScheduledExecutorService writerSvc = Executors.newSingleThreadScheduledExecutor();
private static void testQ() {
final AtomicInteger totalAddCount = new AtomicInteger(10000);
final LinkedBlockingQueue q = new LinkedBlockingQueue(10000);
Thread writer = new Thread() {
public void run() {
System.out.println("Started writer");
try {
int count = 0;
while (count++ < 2000) {
q.add(new Integer(0));
}
System.out.println("total Add count = " + totalAddCount.addAndGet(count));
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Ending writer");
}
}
};
writerSvc.scheduleAtFixedRate(writer, 0, 2000, TimeUnit.MILLISECONDS);
Thread reader = new Thread() {
public void run() {
System.out.println("Started reader");
try {
Integer intE;
int count = 0;
while (count++ < Integer.MAX_VALUE) { //This is where it breaks after the first run
intE = (Integer) q.poll();
if (intE == null) {
System.out.println("Queue object nulll");
break;
}
}
//after a few runs - count will show as 1 and q.size will show increasing
System.out.println("Reader Got [" + count + "] msgs - [" + q.size() + "]");
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Ending reader");
}
}
};
readerSvc.scheduleAtFixedRate(reader, 0, 1000, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) throws Exception {
testQ();
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Keep while loop exit condition lesser than Integer.MAX_VALUE
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Server VM (build 16.3-b01, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
SunOS adapp4-apandey2 5.10 Generic_142910-17 i86pc i386 i86pc Solaris
A DESCRIPTION OF THE PROBLEM :
Using a counter in a while loop where the loop exit condition is like
public void run()
{
while(true)
{
int count = 0;
while(counter++ < Integer.MAX_VALUE)
{......}
}
}
This breaks the while loop after a few runs. After a few runs, the while loop exits after the first run itself
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Running the code attached and following the comments will reproduce the issue. After a few runs, count will show 1 always and q.size will keep on increasing because queue reader does not consume all while the writer keeps on adding the messages to the queue.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expected result - queue reader consumes all messages in the queue.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
mport java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by IntelliJ IDEA.
* User: archit.pandey
* Date: Sep 29, 2011
* Time: 10:23:20 PM
* Bug Testcase for while loop breaking when Integer.MAX_VALUE is used as a breaking condition from the loop.
* Using a counter in a while loop where the loop exit condition is like
*
* public void run()
* {
* while(true)
* {
* int count = 0;
* while(counter++ < Integer.MAX_VALUE)
* {......}
* }
* }
*
* This breaks the while loop after a few runs. After a few runs, the while loop exits after the first run itself
*/
public class TestQBreak {
//executors for running queue reader and writers
private static ScheduledExecutorService readerSvc = Executors.newSingleThreadScheduledExecutor();
private static ScheduledExecutorService writerSvc = Executors.newSingleThreadScheduledExecutor();
private static void testQ() {
final AtomicInteger totalAddCount = new AtomicInteger(10000);
final LinkedBlockingQueue q = new LinkedBlockingQueue(10000);
Thread writer = new Thread() {
public void run() {
System.out.println("Started writer");
try {
int count = 0;
while (count++ < 2000) {
q.add(new Integer(0));
}
System.out.println("total Add count = " + totalAddCount.addAndGet(count));
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Ending writer");
}
}
};
writerSvc.scheduleAtFixedRate(writer, 0, 2000, TimeUnit.MILLISECONDS);
Thread reader = new Thread() {
public void run() {
System.out.println("Started reader");
try {
Integer intE;
int count = 0;
while (count++ < Integer.MAX_VALUE) { //This is where it breaks after the first run
intE = (Integer) q.poll();
if (intE == null) {
System.out.println("Queue object nulll");
break;
}
}
//after a few runs - count will show as 1 and q.size will show increasing
System.out.println("Reader Got [" + count + "] msgs - [" + q.size() + "]");
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Ending reader");
}
}
};
readerSvc.scheduleAtFixedRate(reader, 0, 1000, TimeUnit.MILLISECONDS);
}
public static void main(String[] args) throws Exception {
testQ();
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Keep while loop exit condition lesser than Integer.MAX_VALUE
- duplicates
-
JDK-5091921 Sign flip issues in loop optimizer
-
- Closed
-
- relates to
-
JDK-7100905 For loop crash
-
- Closed
-