
Блокировка на уровне объекта
В параллельной вселенной многопоточного программирования без надлежащей синхронизации царит хаос. Блокировка на уровне объекта в Java создает какофонию, гарантируя, что потоки будут двигаться в одном ритме.
1. Типы блокировок на уровне объекта
Блокировки на уровне объекта в Java могут проявляться в двух основных формах:
- Синхронизированные методы: использование ключевого слова
synchronizedс методом. - Синхронизированные блоки: использование ключевого слова
synchronizedс определенным блоком кода.
2. Синхронные методы
Синхронизированный метод позволяет только одному потоку одновременно выполнять метод для одного и того же объекта.
Пример: система бронирования билетов
Представьте себе кинотеатр, в котором можно забронировать только один билет на определенное место.
public class TicketBooking {
private int seatsAvailable = 10;
public synchronized void bookTicket() {
if (seatsAvailable > 0) {
seatsAvailable--;
System.out.println("Ticket booked successfully!");
} else {
System.out.println("No seats available!");
}
}
}
- Как это работает. Когда поток вызывает
bookTicket, он получает встроенную блокировку объекта, предотвращая одновременный доступ других потоков к синхронизированному методу того же объекта.
3. Синхронизированные блоки
Синхронизированный блок обеспечивает более точное управление, позволяя синхронизировать определенные части метода.
Пример: общая библиотечная система
Рассмотрим библиотеку, в которой несколько студентов могут брать книги, но только один студент может одновременно обновлять библиотечный каталог.
public class Library {
private int booksAvailable = 100;
public void borrowBook() {
synchronized (this) {
if (booksAvailable > 0) {
booksAvailable--;
System.out.println("Book borrowed successfully!");
} else {
System.out.println("No books available!");
}
}
// Other non-synchronized code here…