Synchronized block là đoạn mã dùng để đồng bộ hóa trên tài nguyên cụ thể của phương thức. Nó khóa một đối tượng cho tài nguyên chung và phạm vi của synchronized block nhỏ hơn synchronized method.
Cú pháp
synchronized(object) {
// khối mã
}
Ở đây, object là tham chiếu đến đối tượng được đồng bộ. Synchronized block đảm bảo lời gọi phương thức thành viên của đối tượng chỉ xảy ra sau khi luồng hiện tại đã nhập thành công monitor của đối tượng.
Ví dụ
class TicketCounter {
int availableSeats = 2;
void bookTicket(String name, int numberOfSeats) {
if((availableSeats >= numberOfSeats) && (numberOfSeats > 0)) {
System.out.println(name + ": " + numberOfSeats + " Seats Booking Success");
availableSeats -= numberOfSeats;
} else {
System.out.println(name + ": Seats Not Available");
}
}
}
class TicketBookingThread extends Thread {
TicketCounter tc;
String name;
int seats;
TicketBookingThread(TicketCounter tc, String name, int seats) {
this.tc = tc;
this.name = name;
this.seats = seats;
}
public void run() {
synchronized(tc) { // synchronized block
tc.bookTicket(name, seats);
}
}
}
public class SynchronizedBlockTest {
public static void main(String[] args) {
TicketCounter tc = new TicketCounter();
TicketBookingThread t1 = new TicketBookingThread(tc, "Adithya", 2);
TicketBookingThread t2 = new TicketBookingThread(tc, "Jai", 2);
t1.start();
t2.start();
}
}
Kết quả
Adithya : 2 Seats Booking Success Jai : Seats Not Available