Java 这段代码不是线程安全的吗?
我有一个静态方法,使用JCGM API读取图像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
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所说的,这是一个一般性的问题。考虑到
维度
是可变的,该方法本身不是线程安全的。