并发问题和hashmap

时间:2013-04-08 18:06:04

标签: java concurrency hashmap

我开始考虑为我的游戏进行多线程处理,最好的起点是将游戏的三个主要组成部分:逻辑,gfx,sfx分成3个单独的线程。问题是他们都需要访问相同的hashmap实体,因为逻辑,gfx和sfx彼此完全分开。

private Map<String, Entity> entities;
private Map<String, GameSound> sounds;
private Map<String, ArrayList<BufferedImage>> images;

相同的散列映射会传递给不同的类,并且对象损坏很可能是多个线程。目前SoundsEngine是一个线程(否则音乐在Thread.sleep()之间暂停,这很好,因为它不会改变,它只是读取。

实现线程安全HashMap是否有一种简单(而不是强硬的性能)方法,而不是在我的代码中添加同步(并且可能以这种方式引入更多错误)?我考虑每60帧拍一张浅色副本,因为这是我游戏中任何东西都会改变的最大速率,并将游戏环境中的副本传递给不同的引擎,但这似乎是一个遗憾&#34; hacky&#34;。

并发问题由工厂中的构造函数显示:

public class Factory {

    private Map<String, Entity> entities;
    private Map<String, GameSound> sounds;
    private Map<String, ArrayList<BufferedImage>> images;
    private GameEventListener listener;
    private GameFrame frame;
    private ImageLoader Iloader;
    private SoundLoader Sloader;


    public Factory() {
        this.Iloader = new ImageLoader("imagelist.txt", images);
        this.Sloader = new SoundLoader("soundlist.txt", sounds);
        this.frame = new GameFrame(Color.black);
        this.listener = new GameEventListener();
    }

    public GameEngine createGameEngine() {
        return new GameEngine(entities, images, sounds);
    }

    public SoundEngine createSoundEngine() {
        return new SoundEngine(entities, sounds);
    }

    public GraphicsEngine createGraphicsEngine() {
        return new GraphicsEngine(entities, frame);
    }
}

编辑:Singletons不是一个选项,已经在之前的游戏中做过,我想学习更多&#34;松散&#34;我可以独立开发发动机而不会破坏某些东西的设计,因为我的状态是错误的。

2 个答案:

答案 0 :(得分:4)

如果您想获得Hashmap的同步版本,那么您可以使用java.util.Collections类的以下内置方法:

Map m = Collections.synchronizedMap(new HashMap(...));

除此之外java.util.concurrent.ConcurrentHashMap对你来说是更好的选择。

答案 1 :(得分:1)

使用ConcurrentHashMap更好,因为它不使用synchronized块。它更有效,更快捷。 Collections.synchronizedMap是一个代理,其中将同步块添加到每个方法调用。