2012-02-08 88 views
1

我有一个对象,我想要锁定。锁定对象java

class TestObj { 
    Lock lock = new Lock(); 

    public void lockObj { 
     lock.lock(); 
    } 

    public void unlockObj { 
     lock.unlock(); 
    } 

    // other methods/attributes omitted 
} 

class Test { 
    public static void main(String[] args) { 
     TestObj testObj = new TestObj(); 
     testObj.lockObj(); 
    } 
} 
请问

该锁的TestObj对象?所以其他对象/线程不能访问这个特定的TestObj?

+2

你为什么要锁定一个对象?一个对象和一个线程是两个完全不同的东西。而且一旦对象A引用了另一个对象B,就无法阻止A使用B.请解释你想要在更高层次上做什么。 – 2012-02-08 15:27:39

回答

1
请问

该锁的TestObj对象?所以其他对象/线程不能访问这个特定的TestObj?

它会锁定在这个意义上,任何其他线程将阻止对象(即,等待)如果试图调用lockObj()

如果另一个线程简单地跳入并开始访问对象而不调用lockObj(),没有什么可以阻止它。

在这一点上,我鼓励您阅读​​关键字,这是在Java中进行锁定的惯用方式。 Java并发教程has some material

1

这不是通常使用的模式,但它可以用来防止其他线程访问该对象。同一线程中的其他对象仍然可以访问它。

正如@rcook指出的那样,这并不妨碍其他线程访问该对象,除非他们也尝试获取该锁。

如果您获取锁并将其释放为该类的每种方法的一部分,则可以确定没有获取锁的情况下无法访问该对象。 (这就是通常推荐的原因)

有什么理由不在这里使用标准成语Lock

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html

+2

我想你应该提到,这没有什么阻止其他线程访问对象 - 它做了什么,它阻止了其他线程获取锁定对象。只有其他线程在访问之前获得锁定,才会阻止访问。恐怕OP可能不知道锁定机制需要合作。 – arcy 2012-02-08 15:29:46