Aynı anda birçok iş parçacığından erişilmesi gereken bir alan var. x
'un her bir iş parçacığı için ayrı bir kopyasına sahip olmasını istiyorum, her biri özgün değerinden başlıyor. Bunu volatile
anahtar sözcüğünü kullanarak yapmaya çalıştım, ancak her yeni iş parçacığı, diğer iş parçacıkları için hala x
değiştirir. Her iş parçacığı için ayrı x
değerini tutmak nasılHer bir iş parçacığı için ayrı ayrı durum nasıl sağlanır
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...
veya çözmek için daha optimum bir yolu vardır:
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;
}
}
çıktı: İşte
bir kod örneği görev?
Bir göz atın: http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html –
@TotZam evet, atomik denedim ama işe yaramadı gibi görünüyor açıkladığım durum; Her neyse biraz daha sonra tekrar deneyeceğim :) – user390525
@TotZam Her iş parçacığı için ortak bir değer değil, her iş parçacığı için ayrı bir değer olduğunu düşünüyorum. –