首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发问题和hashmap

并发问题和hashmap
EN

Stack Overflow用户
提问于 2013-04-09 02:06:04
回答 2查看 433关注 0票数 2

我开始考虑我的游戏的多线程,最好的起点是将游戏的三个主要组件分离:逻辑,gfx,sfx,分成三个独立的线程。问题是它们都需要访问相同的实体hashmap,因为逻辑上,gfx和sfx是完全分离的。

代码语言:javascript
复制
private Map<String, Entity> entities;
private Map<String, GameSound> sounds;
private Map<String, ArrayList<BufferedImage>> images;

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

有没有一种简单的方法(不会对性能造成严重影响)来实现线程安全的HashMap,而不需要在我的代码中添加synchronized (这样可能会引入更多的bug)?我想过每隔60帧进行一次浅拷贝,因为这是我的游戏中任何东西都会改变的最大速率,并在gameloop中将拷贝传递给不同的引擎,但这似乎有些“老生常谈”。

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

代码语言:javascript
复制
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);
    }
}

编辑:单例不是一个选项,在以前的游戏中已经这样做了,我想学习一种更“松散”的设计,在这种设计中,我可以独立开发引擎,而不会因为我的状态错误而破坏一些东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-09 02:10:38

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

代码语言:javascript
复制
Map m = Collections.synchronizedMap(new HashMap(...));

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

票数 4
EN

Stack Overflow用户

发布于 2013-04-09 03:49:35

使用ConcurrentHashMap更好,因为它不使用同步块。它是如此的高效和快速。Collections.synchronizedMap是一个代理,其中将在每个方法调用中添加一个同步块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15885891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档