У меня есть поле int x
, к которому, как предполагается, можно получить доступ из многих потоков одновременно. Я хочу, чтобы x
имел отдельную копию на поток, каждый из которых начинался с первоначального значения. Я попытался сделать это, используя ключевое слово volatile
, но каждый новый поток по-прежнему изменяет x
для других потоков.Как сохранить состояние для каждой нити отдельно
Вот пример кода:
public class StackOverflowThread0 {
public StackOverflowThread0() {
new A().start();
}
public static void main(String[] args) {
new StackOverflowThread0();
}
volatile int x = 0;//<--keep original for each thread?
class A extends Thread {
@Override
public void run() {
try {
while (true) {
getT().start();
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
Thread getT() {
Thread t = new Thread() {
@Override
public void run() {
x++;
for (int i = 0; i < 100; i++) {
try {
System.out.println("x=" + x + " | thread id=" + Thread.currentThread().getId() + "| 100*x+x=" + (100 * x + x));
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
interrupt();
}
};
return t;
}
}
выход:
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101
x=1 | thread id=10| 100*x+x=101 //thread 10 has x field value as 1
x=2 | thread id=11| 100*x+x=202 //thread 11 modifies x field to 2
x=2 | thread id=10| 100*x+x=202 //thread 10 lost x value as 1 :(
etc...
Как сохранить отдельный x
значение для каждого потока, или есть более оптимальный способ решить задача?
Посмотрите здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html –
@TotZam да, я пробовал атомарно, но кажется, что он не работает в случай, который я описываю; В любом случае я попробую еще раз немного :) – user390525
@TotZam Я думаю, что он был отдельным значением для каждого потока, а не общим значением для всех потоков. –