我的问题是为什么我应该使用final来装饰变量list?它被匿名内部类的实例使用没有final,它不会被编译。为什么我应该在多线程程序中“最终”共享变量
的代码如下所示:
public class TwoThreadsOneListCurrModi
{
public static void main(String[] args)
{
final List<String> list = Collections.synchronizedList(new ArrayList<String>());
for (int i =0 ; i<20;i++)
list.add(String.valueOf(i));
Thread t1 = new Thread(new Runnable(){
@Override
public void run()
{
synchronize(list) {
System.out.println("size of list:" +list.size());
}
}
});
t1.start();
}
}
但是,如果使用普通的类,它是好的。
public class TwoThreadsOneListCurrModi2
{
public static void main(String[] args)
{
final List<String> list = Collections.synchronizedList(new ArrayList<String>());
initialize list;
Thread t1 = new WorkThread(list);
Thread t2 = new WorkThread(list);
t1.start();
t2.start();
}
}
class WorkThread extends Thread{
List<String> list;
public void run(){
do sth with list and synchronize block on list
}
Work1(List<String> list)
{ this.list = list; }
}
的确,我们投票选出一个重复的问题来结束这个问题。 –