Вы можете скопировать вставку приведенного ниже примера для запуска на вашем локальном компьютере. Я изучаю MultiThreading, и я наткнулся на этот пример онлайн. Я смущен тем, почему метод add (внутри класса Counter) может иметь значение, если объявлено синхронизированным, вы можете удалить синхронизированное из него ключевое слово, и это не повлияет на конечный результат, поэтому мне просто интересно, какова цель, которую нужно обслуживать объявив его синхронизированнымКакова цель объявления метода, синхронизированного в следующем примере:
class Counter {
long count = 0;
public synchronized void add(long value) {
this.count += value;
System.out.println(count + "-" + Thread.currentThread().getName());
}
}
class CounterThread extends Thread {
protected Counter counter = null;
public CounterThread(Counter counter) {
this.counter = counter;
}
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(CounterThread.class.getName()).log(Level.SEVERE, null, ex);
}
counter.add(i);
}
}
}
public class Example {
public static void main(String[] args) {
Counter counter = new Counter();
Thread threadA = new CounterThread(counter);
Thread threadB = new CounterThread(counter);
Thread threadC = new CounterThread(counter);
threadA.start();
threadB.start();
threadC.start();
}
}
Если вы удалили спящий режим и увеличили его до 100000000 итераций или так (чтобы он не сразу завершился) и напечатайте значение счетчика в конце (после того, как основной поток присоединяется к другим потокам), вы будете см. разницу. – immibis
@immibis Да, я сделал подобный эксперимент, и конечный результат не был тем, что ожидалось. –