プログラムを書きました
class ThreadRun implements Runnable {
NumberValue number;
int value;
ThreadRun(NumberValue number,int value) {
this.number=number;
this.value = value;
Thread t = new Thread(this);
t.start();
}
@Override
public void run() {
number = number.getThreadLocal();
number.setId(number.getId()+value);
System.out.println(number.getId());
}
}
public class ThreadTest {
public static void main(String[] args) {
NumberValue number = new NumberValue(1);
new ThreadRun(number, 1);
new ThreadRun(number, 2);
}
}
class NumberValue {
int id;
ThreadLocal<NumberValue> threadLocal = new ThreadLocal<NumberValue>() {
@Override
protected NumberValue initialValue() {
return new NumberValue(id);
}
};
NumberValue(int id) {
this.id = id;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
public NumberValue getThreadLocal() {
return threadLocal.get();
}
}
output: 2 3 この出力は、予想される出力です
でもコメントすると
// number = number.getThreadLocal(); 実行プログラムの出力は次のようになります。 3 4 // number = number.getThreadLocal(); の場合、データは破損しています。がコメントされています。したがって、threadlocal は NumberValue のローカル コピーを作成します。しかし、threadlocal が使用されていない場合、同じオブジェクト インスタンスがスレッド間で共有されるため、データの結果は実際の結果よりも破損しています。