简单的Java并发问题

时间:2015-01-09 11:01:38

标签: java concurrency

我有一个扩展JPanel的类,通过覆盖paint方法在屏幕上绘制~10个图像(使用此方法,因为我希望能够在绘制每个图像时操作图像)。我想要做的是在类中有一个更新方法,我每帧传递一个潜在的图像更新列表。这就是我所拥有的

List<BufferedImage> imageList = Collections.synchronizedList(new ArrayList());

public void update(list<String> imagePaths) {
    for (String path : imagePaths) {
        synchronized (imageList) {
            //Modify image list adding and removing buffered images
        }
    }
    repaint();
}

@Override
public void paintComponent(Graphics g) {
     synchronized (imageList) {
         g.drawImage(img, 0, 0, this);
     }
}

目前您可以想象由于同步块而导致它运行速度极慢?我怎样才能大幅度提高性能呢?

1 个答案:

答案 0 :(得分:1)

您正在使用同步列表,然后在迭代时同步 该列表。通过使用像CopyOnWriteArrayList这样的东西,你可能会看到更好的性能,它会在迭代时提供一致的快照,并完全删除同步的块。

虽然看着你的代码片段,我不清楚哪个列表正在迭代 - 你有imageListimagePaths,我不知道从哪里检索实际图像列表。