public Foo getFoo(){
Foo foo = null;
synchronized(fooList){
if(fooList.size() > 0){
foo = fooList.remove(0);
}
}
return foo;
}
由于foo
在同步块之外声明,是否存在返回坏数据的可能性?
public Foo getFoo(){
Foo foo = null;
synchronized(fooList){
if(fooList.size() > 0){
foo = fooList.remove(0);
}
}
return foo;
}
由于foo
在同步块之外声明,是否存在返回坏数据的可能性?
每个线程实例调用getFoo()
都会有自己的foo
实例。因此foo
是线程安全的,不需要同步。
在这种情况下,“不良数据”是什么意思?可能会在相应的右大括号fooList
之前和之后异步更改,之前(更一般地说,直到使用返回值的那一刻。)您的最终目标是什么?synchronized(fooList)
return foo;
getFoo
不会返回过时的数据,因为Foo foo
是局部变量并且fooList
是同步的
局部变量是线程安全的,因为每个线程调用都会创建一个新Foo
对象,而不是共享单个对象。而变量不是线程安全的,因为多个线程可以访问fooList
,但在这种情况下fooList
已经同步。