0
public Foo getFoo(){
    Foo foo = null;

    synchronized(fooList){
        if(fooList.size() > 0){
            foo = fooList.remove(0);
        }
    }

    return foo;
}

由于foo在同步块之外声明,是否存在返回坏数据的可能性?

4

3 回答 3

4

每个线程实例调用getFoo()都会有自己的foo实例。因此foo是线程安全的,不需要同步。

于 2012-04-19T15:25:18.210 回答
1

在这种情况下,“不良数据”是什么意思?可能会在相应的右大括号fooList之前和之后异步更改,之前(更一般地说,直到使用返回值的那一刻。)您的最终目标是什么?synchronized(fooList)return foo;

于 2012-04-19T15:23:34.443 回答
1

getFoo不会返回过时的数据,因为Foo foo是局部变量并且fooList是同步的

局部变量是线程安全的,因为每个线程调用都会创建一个新Foo对象,而不是共享单个对象。而变量不是线程安全的,因为多个线程可以访问fooList,但在这种情况下fooList已经同步。

于 2012-04-19T15:23:41.080 回答