Блокировка на уровне объекта

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