java多线程编程内存一致性问题

时间:2011-08-07 23:20:41

标签: java multithreading

A是AbstractCollection的子类。

final A a = new A();
... //Add some objects into a

ExecutorService es = Executors.newFixedThreadPool(1);
Future f1 = es.submit(new Callable<B>() {
    public B call() {
        ... //Modify the objects in a
        return B;
    }
});
f1.get();
... //Read a

现在的问题是,当我读到a时,修改不存在。根据java文档:“异步计算所采取的操作发生在另一个线程中相应的Future.get()之后的操作之前”。所以我想知道为什么会出现这种不一致的情况。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我用一些标准对象重新编写了你的​​例子,它似乎运行良好:

public static void main(String[] args) throws Throwable
{
    final StringBuffer a = new StringBuffer();
    a.append("a");

    ExecutorService es = Executors.newFixedThreadPool(1);
    Future<String> f1 = es.submit(new Callable<String>()
    {
        @Override
        public String call()
        {
            a.append("b");
            return "done";
        }
    });

    f1.get();
    System.out.println(a.toString());
    es.shutdownNow();
}

如果您使用的是良好的IDE,您可以随时断点代码以查看实际的并发行为。

也许您的问题在A课程内。