Конечно, просто используйте синхронизированное ключевое слово :
private final Object LOCK = new Object();
int counter1;
int counter2;
public void method1() {
synchronized(LOCK) {
if (counter1>0) {
...........do something
if (counter2>0) {
....do something else
}
}
}
public void method2() {
synchronized(LOCK) {
counter1=0;
counter2=0;
}
}
Несколько советов:
Используйте частный объект для синхронизации, а не для пометки метода как синхронизированного. Это препятствует тому, чтобы что-то внешнее для вас, класс, захватило блокировку и заблокировало вещи.
Убедитесь, что вы используете синхронизированное ключевое слово везде , и убедитесь, что вы всегда синхронизируете один и тот же объект. Если вы забудете выполнить одно из этих действий, два процесса смогут одновременно получить доступ к полям.
Остерегайтесь тупиков. В идеальном мире вы бы написали модульные тесты, чтобы убедиться, что блокировка работает так, как вы думаете.