Java 这段代码不是线程安全的吗?

Java 这段代码不是线程安全的吗?,java,multithreading,Java,Multithreading,我有一个静态方法,使用JCGM API读取图像 public static BufferedImage readBlackAndWhite(final ImageInputStream pIntputstream, Dimension pDim) throws IOException { ImageReaderSpi lCgmImageReaderSpi = new CGMImageReaderSpi(); CGMImageReader lReader = new CGM

我有一个静态方法,使用JCGM API读取图像

public static BufferedImage readBlackAndWhite(final ImageInputStream pIntputstream,
    Dimension pDim) throws IOException {
    ImageReaderSpi lCgmImageReaderSpi = new CGMImageReaderSpi();
    CGMImageReader lReader = new CGMImageReader(lCgmImageReaderSpi);
    lReader.setBlackAndWhite(true);
    lReader.setInput(pIntputstream);
    return lReader.read(0, pDim.width, pDim.height);
}
我认为这不是线程安全的。因为此方法是静态的,
pIntputstream
pDim
将在多线程环境中导致问题

将synchronized添加到方法定义将使其成为线程安全的。 但是会降低性能


我想知道使这个方法线程安全的另一个最好的方法是什么。记住性能?

如果超过1个线程使用相同的
pIntputstream
调用
readBlackAndWhite
,那么这可能是不安全的。InputStreams通常通过多次调用其
read
方法分块读取。想象一下,许多线程在同一个输入流上交替调用
read
,听起来很糟糕,不是吗

使其同步应该使其安全,因为在任何给定实例中,只有一个线程可以位于
readBlackAndWhite
内,但正如您所提到的,这将降低吞吐量


如果您不想使其同步,我可以想到的另一种方法是为每个线程提供其自己的InputStream副本以供读取,因此它与其他线程完全隔离。

如果您保证以下条件,则您的代码是线程安全的:

1) 您的流不与其他线程共享(流很少是线程安全的-它们希望由单个线程处理)

2) 您的维度对象要么是:a)不可变b)不与任何其他线程共享c)线程安全d)有效不可变-这意味着其他线程可能对其进行了操作,但随后以安全的方式将其发布给其他线程使用,此后未发生任何状态修改

3) CGMImageReaderSpi和CGMImageReader的构造函数以及ImageInputStream的读取方法没有与其他线程共享的一些状态变量发生冲突


或者,如果上面的一个或多个条件不成立,那么代码仍然可以是线程安全的,如果它总是以互斥的方式执行,使用某种锁(例如同步块)。

为了更安全,您也可以使用runnable接口。这个问题目前非常普遍,这是一个非常广泛的主题。关于线程安全,没有最好的方法。就像@radiodef所说的,这是一个一般性的问题。考虑到
维度
是可变的,该方法本身不是线程安全的。