2011-09-16 27 views
5

thể trùng lặp:
What is the Re-entrant lock and concept in general?Khóa reentrance trong java được sử dụng để làm gì?

Tôi cố gắng để hiểu khóa reentrant trong java và tôi đang tìm kiếm một lời giải thích đơn giản. Tại sao khóa lại cần thiết? vấn đề gì nó giải quyết? Một kịch bản ví dụ sẽ giúp ích.

+0

Không hoàn toàn trùng lặp. Câu hỏi này cụ thể hơn nhiều và liên quan đến một số triển khai khóa Java cụ thể. Câu hỏi khác là rất chung chung. – Eddie

Trả lời

3

Khóa reentrant là khóa cùng một chủ đề có thể nhận được nhiều lần. Thông thường, một khóa reentrant phải được mở khóa cùng một số lần nó bị khóa. Một khóa reentrant thường dễ dàng hơn để mã hóa với. Nếu bạn có một số phương thức trong đó A gọi B và B gọi C ... nhưng khách hàng của mã này có thể gọi vào A hoặc B hoặc C và nếu bạn muốn khóa trong mỗi phương pháp này thì khóa reentrant sẽ giải quyết vấn đề. Nó sẽ ngăn chặn bất kỳ chủ đề nào khác ngoài một lần truy cập vào mã này, nhưng nó sẽ cho phép nhiều lần mua lại khóa để bạn không bị bế tắc.

Hãy nói rằng bạn có điều này:

public class SyncTest { 
    private final Lock lock = new ReentrantLock(); 
    public void doA() { 
    lock.lock(); 
    try { 
     doB(); 
     doSomethingForA(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doB() { 
    lock.lock(); 
    try { 
     doC(); 
     doSomethingForB(); 
    } finally { 
     lock.unlock(); 
    } 
    } 

    public void doC() { 
    lock.lock(); 
    try { 
     doSomeWorkThatEveryoneDoes(); 
    } finally { 
     lock.unlock(); 
    } 
    } 
} 

nơi mã khác có thể gọi bất kỳ doA hoặc doB hoặc doC và tất cả trong số họ đồng bộ xung quanh một số công việc bằng cách sử dụng khóa tương tự. Khóa được sử dụng là "reentrant" trong cùng một luồng có thể lấy nó nhiều lần. Nếu khóa không reentrant, sau đó khi bạn gọi doA, thời điểm bạn nhập doB và cố gắng để có được khóa, bạn sẽ bế tắc vì khóa đã được sở hữu, mặc dù nó sẽ xảy ra được sở hữu của chính mình.

Một semaphore đếm tinh khiết được khởi tạo thành một số, ví dụ, là một khóa không reentrant. Nếu cùng một luồng cố gắng lấy nó hai lần, nó sẽ chặn mãi mãi trong một loại tự bế tắc.

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