簡體   English   中英

Java 中可重入鎖中的 synchronized(object) 的等價物是什么?

[英]What is the equivalent of synchronized( object ) in Reentrant lock in Java?

在下面給出的代碼中。 如何知道 Reentrant Lock 鎖定了哪個對象?

Public class Test {

    Map obj1 = new HashMap();
    Object ob2 = new Object();

    void Method() {

        //First
        synchronized(ob1) { // Locks obj1

        }
        synchronized(ob2) { // Locks obj2

        }

        //Second
        Lock lock = new ReentrantLock(); // Which object is getting locked here? 
        lock.lock();
        try {

        } finally {
            lock.unlock();
        }

    }

}

 

在上面的例子中,哪個對象被鎖定了? 如果我想使用可重入鎖顯式鎖定 obj1 和 obj2 怎么可能?

Lock lock = new ReentrantLock(); // Which object is getting locked here? lock.lock();

lock對象被鎖定在那里。

我想你可能誤解了synchronized(ob1) {...}作用。 不會阻止其他線程使用obj1 它唯一阻止的是,它阻止其他線程同時在同一對象上同步。

Java(以及大多數其他編程語言/庫)中的是所謂的建議鎖 “建議”的意思是,程序員必須知道鎖應該保護哪些數據,並且程序員有責任確保程序中的任何線程都不會使用該數據,除非線程鎖定了鎖。


僅供參考:Java 中的“干凈”實踐是以這種方式使用synchronized

class MyClass {

    private final Object lock = new Object();
    private TypeA sharedMemberVariable_a;
    private TypeB sharedMemberVariable_b;
    ...

    public SomeType someMethod() {
        ...
        synchronized(lock) {
            ...access shared member variables...
        }
        return ...;
    }
}

此模式允許您發布MyClass實例,而無需將lock對象暴露給調用者。 它還非常清楚地區分了lock對象本身和受鎖保護的數據/關系。

如果您將來需要這樣做,該模式還可以輕松地從使用synchronized切換到使用Lock對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM