, поэтому я тестировал с ключевым словом synchronized
. Вот пример, который я попробовал:
public class MyTest {
static int i = 0;
public static void main(String[] args) {
new Thread(t1).start();
new Thread(t2).start();
}
private static void countMe(String name){
i++;
System.out.println("Current Counter is: " + i + ", updated by: " + name);
}
private static Runnable t1 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t1");
}
} catch (Exception e){}
}
};
private static Runnable t2 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t2");
}
} catch (Exception e){}
}
};
}
Когда я запускаю его, результат вызова метода countMe()
из двух потоков генерирует этот вывод:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 3
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
А когда я меняю метод countMe()
на:
private synchronized static void countMe(){
i++;
System.out.println("Current Counter is: " + i);
}
Я получаю этот вывод:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 3
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
Хотя это дает мне четкое понимание цели synchronized
, я хочу знать, есть ли и другая причина, по которой мы можем использовать synchronized
. Или то, что я здесь сделал, - единственное, почему нам нужно использовать это ключевое слово synchronized
?
Спасибо.
РЕДАКТИРОВАТЬ: Еще одна вещь, с которой я путаюсь, заключается в том, что в первом выводе счетчик перешел на 3 после 7. Это кажется мне немного невозможным, но подобные результаты случаются каждый раз, когда я пытаюсь, это нормально?