Ich habe keine Möglichkeit, diese zu erklären, aber ich fand dieses Phänomen in Code der jemand anderem:Security von I/O-Code in einem parallelen Strom
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.util.stream.Stream;
import org.junit.Test;
public class TestDidWeBreakJavaAgain
{
@Test
public void testIoInSerialStream()
{
doTest(false);
}
@Test
public void testIoInParallelStream()
{
doTest(true);
}
private void doTest(boolean parallel)
{
Stream<String> stream = Stream.of("1", "2", "3");
if (parallel)
{
stream = stream.parallel();
}
stream.forEach(name -> {
try
{
Files.createTempFile(name, ".dat");
}
catch (IOException e)
{
throw new UncheckedIOException("Failed to create temp file", e);
}
});
}
}
Wenn es mit dem Sicherheitsmanager ausführen aktiviert ist, nur parallel()
Aufruf in einem Stream oder parallelStream()
beim Abrufen des Streams aus einer Sammlung scheint zu garantieren, dass alle Versuche, I/O durchzuführen, SecurityException
werfen. (Wahrscheinlich ruft jedes Verfahren, das kann throw SecurityException
, wird Wurf.)
Ich verstehe, dass parallel()
bedeutet, dass es in einem anderen Thread ausgeführt werden, die nicht die gleichen Privilegien wie die haben könnten wir begannen mit , aber ich denke, ich dachte, dass der Rahmen dafür sorgen würde.
Entfernen von Anrufen an parallel()
oder parallelStream()
in der Codebasis vermeidet das Risiko. Das Einfügen eines behebt es auch, aber klingt für mich nicht sicher, zumindest nicht in allen Situationen. Gibt es noch eine andere Option?
Bitte geben Sie den Stack-Trace einer Ausnahme an, die Sie erhalten –
Fügen Sie auch Ihren 'SecurityManager'-Code hinzu, damit wir Ihr Problem genau reproduzieren können. –
Dies hat möglicherweise mit parallelen Streams zu tun, die den gemeinsamen Fork-Join-Pool verwenden. Wie funktioniert es [wenn Sie Ihren eigenen Pool zur Verfügung stellen] (http://stackoverflow.com/a/22269778/829571)? – assylias