Блокировка на уровне объекта
В параллельной вселенной многопоточного программирования без надлежащей синхронизации царит хаос. Блокировка на уровне объекта в 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…