final+基本变量,通常用作常量,像圆周率;
final+引用变量,保证不会再指向别的引用,但引用里的值可能变动;
final+类,该类不能作为父类被继承;
final+方法,该方法不能被重写;
曾经写过类似下面这样的代码:
/**
* 2018年5月20日上午9:20:05
*/
package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author xinwenfeng
*
*/
public class Testfinal {
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
List<Integer> list = new ArrayList<>();
for(int i=1; i<=10; i++) {
list.add(i);
}
final AddInt addInt = new AddInt();
for(final Integer i : list) {
pool.execute(new Runnable() {
@Override
public void run() {
addInt.setA(i);
showAdd(addInt, i);
}
});
}
}
public static void showAdd(AddInt addInt, int b) {
System.out.println(addInt.getA()+b);
}
}
class AddInt{
private int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
期望得到的结果都应该是2的倍数,运行几次后结果有可能出现这样的:
出现了奇数3。
原因就在于showAdd方法的参数,我传递了final的引用对象,导致在使用的时候可能被别的线程改变引用对象里的值,使得方法里的两个数不再相同。