Каждый метод, касающийся общего состояния, получает собственную внутреннюю блокировку объекта на время вызова, поэтому внутри критической секции одновременно выполняется только один поток, а вызывающие объекты получают прямое синхронное возвращаемое значение. Метод synchronized в Java заключается именно в этом — блокировка монитора объекта защищает тело метода.
Пример
@Aspect@ComponentpublicclassLoggingAspect {
@Around("@annotation(com.acme.Loggable)")publicObjectlogExecutionTime(ProceedingJoinPoint pjp)throws Throwable {
longstart= System.currentTimeMillis();
Objectresult= pjp.proceed(); // invokes the real method
log.info("{} took {}ms", pjp.getSignature(), System.currentTimeMillis() - start);
return result;
}
}
Итог
Каждый метод, касающийся общего состояния, получает собственную внутреннюю блокировку объекта на время вызова, поэтому внутри критической секции одновременно выполняется только один поток, а вызывающие объекты получают прямое синхронное возвращаемое значение.
Что такое шаблон объекта монитора и как ключевое слово «synchronize… · Sobeso