Рассмотрим, когда потоки запускаются - например:
public class MyThread implements Runnable {
private String name;
public void kickOff() {
Thread thread1 = new Thread();
thread1.start();
Thread thread2 = new Thread();
thread2.start();
}
public void run() {
Person person = findSomeRandomPerson();
printPerson(person);
}
public void printPerson(Person person) {
String desc = person.toString();
doSomething(desc);
// This is bad - the threads can interfere
this.name = "Hello " + desc;
doMore(this.name)
}
}
Итак, здесь у нас есть один экземпляр класса MyThread с двумя работающими потоками - оба начинаются с метода run()
.
Что означает бит local variables
, так это то, что локальные переменные в методах run()
(и последующие вызовы) не будут влиять друг на друга между потоками (даже если они выполняются в контексте одного и того же экземпляра класса MyThread) .
Например, если thread1 получает Person fred, а thread2 получает Person bill, вызов thread1 printPerson
всегда гарантированно будет desc
описанием fred (и аналогично desc
всегда будет описание для счета в потоке 2).
РЕДАКТИРОВАТЬ В ДОБАВИТЬ: В дополнение к вашему вопросу о том, «если два потока читают одну глобальную переменную асинхронно, каждый поток содержит копию этой переменной»
Нет, потоки не содержат свои собственные копии объектов. Например, рассмотрим переменную экземпляра name
выше.
Это переменная экземпляра MyThread. Как указывалось ранее, оба потока выполняются в контексте ТОГО ЖЕ МОМЕНТА MyThread. Это означает, что они оба получают доступ к ОДНОМУ ИМЕННОМУ имени. Это означает, что когда один изменит «имя», другой увидит это изменение.
В результате установка this.name
и вызов doMore(this.name)
, как это плохо. Например, следующая последовательность действий вполне возможна:
- Поток 1 устанавливает this.name в "Hello fred"
- Поток 2 устанавливает this.name в "Hello bill"
- Поток 1 вызывает doMore (this.name)
Это приведет к тому, что поток 1 вызовет doMore("Hello bill")
, поскольку потоки обращаются к одному и тому же объекту (а не к собственной копии объекта). ).
Добро пожаловать в удивительный мир гоночных условий!