Ключевое слово synchronized
обеспечивает последовательный доступ к блоку кода (который может быть целым методом), который он вводит.Сериализация доступа осуществляется с использованием объекта в качестве мьютекса блокировки.
Три основных варианта использования synchronized
:
A.По статическому методу:
static synchronized void someStaticMethod() {
// The Class object - ie "MyClass.class" - is the lock object for this block of code, which is the whole method
}
B.По методу экземпляра:
synchronized void someInstanceMethod() {
// The instance - ie "this" - is lock object for this block of code, which is the whole method
}
C.Для произвольного блока кода:
private Object lock = new Object();
void someMethod() {
synchronized (lock) {
// The specified object is the lock object for this block of code
}
}
Во всех случаях только один поток одновременно может войти в синхронизированный блок.
Во всех случаях, если один и тот же объект блокировки используется для нескольких блоков, только один поток может ввести любой синхронизированных блоков.Например, если есть два - другие одновременные потоки, вызывающие методы, будут блокироваться, пока первый поток не выйдет из метода.