2010-07-12 29 views
9

Tôi có 2 phương thức được đồng bộ trong một lớp nói phương thức 1() và phương thức 2(). Một chủ đề nói "Thread 1" giữ khóa trên đối tượng của lớp bằng cách thực hiện phương thức đồng bộ1() .Chủ đề khác có thể nói "Thread 2", truy cập khóa thông qua phương thức 2() cùng lúc trong khi giữ "Thread 1" khoá.hai phương thức đồng bộ khác nhau của cùng một đối tượng?

Trường hợp này tương tự với lớp java.util.Vector có các phương thức add() và remove() đã đồng bộ hóa. Vui lòng giải thích trường hợp này quá.

Trả lời

10

No. Phương pháp A synchronized trong Java giống hệt với toàn bộ phương pháp có phần thân được bọc trong khối synchronized (this). Vì vậy, nếu một sợi nằm trong phương thức synchronized, thì một luồng khác không thể đồng thời ở một phương thức synchronized khác nhau trên cùng một đối tượng.

Cách này liên quan đến một Vector là bạn không muốn một số mã cố gắng xóa phần tử trong khi mã khác đang cố gắng thêm phần tử. Đây là khái niệm về phần quan trọng ; bạn không chỉ không muốn người khác cố gắng làm những gì bạn đang làm, bạn cũng không muốn người khác làm điều gì khác mà có thể can thiệp.

+0

Cảm ơn Borealid .. Nhưng nếu đây là trường hợp, Tại sao java cung cấp đồng bộ hóa cụ thể các phương pháp, nó có thể chỉ được cung cấp cho cả lớp? – JavaUser

+1

@JavaUser: 'synchronized (this)' không có nghĩa là toàn bộ lớp được 'đồng bộ'. Nó có nghĩa là bạn có được khóa Object của cá thể mà phương thức được gọi. Bạn không nhất thiết muốn * tất cả * của các phương thức được 'đồng bộ hóa' (trên thực tế, bạn hiếm khi nào). Để có được hiệu suất của mã đa luồng, bạn phải sử dụng càng ít ổ khóa càng tốt trong khi vẫn giữ được độ chính xác của chương trình - mỗi khi bạn có khóa bị khóa, một số luồng sẽ chờ, không làm gì cả. – Borealid

+0

@ Borealid .. thời điểm tôi đã xác định đồng bộ trong bất kỳ phương thức nào, toàn bộ đối tượng bị khóa khi tôi gọi phương thức đó .. tôi có đúng không? – JavaUser

3

Thread2 có thể truy cập khóa nhưng không thể vào khối được bảo vệ bởi khóa đó miễn là Thread1 đang giữ cùng một khóa.

+0

hữu ích. Cảm ơn! – peakit

Các vấn đề liên quan