Я изучаю Java, работаю с Python и пытаюсь понять взаимодействие потоков, начиная с кода и пояснений на этой странице: http://docs.oracle.com/javase/tutorial/essential/concurrency/interfere.html
Чтобы воспроизвести помехи, у меня есть еще один класс, который запускает три потока, каждый из которых случайным образом вызывает либо увеличение, либо уменьшение 10 раз.
Я ожидаю, что с 3 потоками и 30 приращениями или уменьшениями некоторые из них будут перекрываться, и, таким образом, окончательное значение Counter
не будет равно (# increments)
- (# decrements)
.
Но каждый раз, когда я запускаю код и анализирую результат, я нахожу окончательное значение равным (# increments)
- (# decrements)
. Хотя возможно, что после 5 прогонов я каким-то образом не получил никаких помех, гораздо более вероятно, что я неправильно понял эффект помех или непреднамеренно реализовал код, который избегает помех.
Вот мой код:
// file: CounterThreads.java
public class CounterThreads {
private static class CounterThread implements Runnable {
private Counter c;
CounterThread(Counter c)
{
this.c = c;
}
public void run()
{
String threadName = Thread.currentThread().getName();
for (int i=0; i<10; i++) {
try {
if (((int)(Math.random() * 10) % 2) == 0) {
System.out.format("%s - Decrementing...\n", threadName);
c.decrement();
} else {
System.out.format("%s - Incrementing...\n", threadName);
c.increment();
}
System.out.format("%s - The internal counter is at %s\n", threadName, c.value());
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.format("Thread %s interrupted\n", threadName);
}
}
}
}
public static void main(String[] args)
{
Counter c = new Counter();
for (int i=0; i<3; i++) {
Thread t = new Thread(new CounterThread(c));
System.out.format("Starting Thread: %s\n", t.getName());
t.start();
}
}
}
Файл Counter.java
содержит код, скопированный из приведенной выше документации Oracle, воспроизведенный здесь для удобства.
// file: Counter.java
public class Counter {
private int c = 0;
void increment ()
{
c++;
}
void decrement()
{
c--;
}
int value()
{
return c;
}
}
0
- если вы этого не сделаете, значит, что-то не так с вашим подходом к обнаружению. - person Adrian Colomitchi   schedule 10.10.2016Counter
всегда будет равно(# increments) - (# decrements)
, так что в этом нет ничего удивительного - person mangusta   schedule 10.10.2016sleep()
звонков. Кроме того, вместо того, чтобы каждый поток выполнял десять операций, пусть каждый поток выполняет десять миллионов. - person Solomon Slow   schedule 10.10.2016# inc - # dec == final counter value
и в чем могло бы проявиться вмешательство. - person Haleemur Ali   schedule 10.10.2016