Unvorhersehbarer Wert beim Konvertieren des Byte-Arrays in int | Eclipse Temurin-17.0.10+11Java

Java-Forum
Guest
 Unvorhersehbarer Wert beim Konvertieren des Byte-Arrays in int | Eclipse Temurin-17.0.10+11

Post by Guest »

Problembeschreibung:
Beim Ausführen des folgenden Multithread-Programms tritt ein Problem auf. Das Programm erzeugt eine große Anzahl von Threads (10.000), die denselben Byte-Array-Wert verarbeiten. Das Problem tritt bei hoher CPU-Auslastung und bei Anwendung von Speicherbeschränkungen häufiger auf (z. B. Einstellung von -Xms32m -Xmx32m).
Die Methode byteArrayToInt soll ein bestimmtes Segment des Byte-Arrays konvertieren in eine ganze Zahl umwandeln. Es kommt jedoch zeitweise zu falschen Werten. Der erwartete Wert für liVersion ist 1, es werden jedoch stattdessen Zufallswerte beobachtet. Dieses Problem tritt auch dann auf, wenn das Programm mit ausreichend Speicher und einer geringeren Anzahl von Threads (sogar einem einzelnen Thread) ausgeführt wird, aber deutlich seltener auftritt.
Die ganzzahlige Konvertierung des 2. in den 4. Wert von pTestData which is [1, 0] sollte 1 sein, aber es gibt zeitweise zufällige Werte in der Ausgabe.
Umgebung:
Betriebssystem: Windows 10
Java-Version: Eclipse Temurin-17.0.10+11
Codeausschnitt:

Code: Select all

import java.util.Arrays;

public class TestMain
{
private static int miParallelThreadCount = 10000;

private static long mlExecutionIntervalInMillis=100;

public static void main(String[] args)
{
System.out.println("Startin tornado at interval: " + mlExecutionIntervalInMillis + " with parallel threads: " + miParallelThreadCount);
while(true)
{
//Runs the test code to reproduce the issue
runTornado();
try
{
Thread.sleep(mlExecutionIntervalInMillis);
} catch (Throwable lThrowable)
{
System.out.println("Task failed due to: " + lThrowable.getLocalizedMessage());
lThrowable.printStackTrace();
}
}
}

private static void runTornado()
{
//Test byte array
byte[] data = new byte[]
{ 65, 50, 1, 0, 1, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 53, -76, -66, 125, -115, 69, -111, 80, -81, -33, -62, 84, -59, -64, -114, 113, -92, -59, 37, 106, 85, -111, -100, -19, 114, 99, 18, -9, -62, -123, -75, -22, -40, 70, -70, -46, 119, 11, -17, -71, -93, -126, -28, 116, 104, -4, -45, -58, 121, 4, 50, 76, 46, 13, -91, -76, 37, -103, 101, 57, 54, 75, 83, -124 };

for(int i=0; i
{
try
{
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
compareInner(data, 0, data.length);
}
catch (Throwable lThrowable)
{
System.out.println("Something went wrong: " + lThrowable.getLocalizedMessage());
lThrowable.printStackTrace();
}
}).start();
}
System.out.println("Ran tornado");
}

private static byte[] compareInner(byte[] pTestData, int pStartIndex, int pLength)
{
//Copies the pTestData into new array as it is
byte[] lbarrData = Arrays.copyOfRange(pTestData, 0, 0 + pTestData.length);
//copies only 2ndand 3rd element from the array which is [1, 0]
byte[] lbarrVer = Arrays.copyOfRange(lbarrData, 2, 4);

//Converts the array [1, 0] into integer, which should always return 1
int liVersion = byteArrayToInt(lbarrVer);

if(liVersion != 1)
{
System.out.println("Invalid Version : " + liVersion + " data array: " + Arrays.toString(lbarrData) +  " header array: " + Arrays.toString(lbarrVer));
}

return lbarrData;
}

public static final int byteArrayToInt(byte[] pSource)
{
int lValue = 0;
for (int i = 0; i < pSource.length; i++)
{
lValue += (pSource[i] & 0xff)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post