Pac*_*ier 7 java concurrency multithreading
大家好,每当我使用synchronized语句时,我经常使用这种模式:
private static Object lock = new Object();
public void F(){
    //..
    synchronized (lock){
        //..
    }
    //..
}
但是,在源头中java.lang.Reference,我看到他们采用这种模式:
static private class Lock { };
private static Lock lock = new Lock();
public void run() {
//..
synchronized(lock){
    //..
}
//..
}
我想知道声明一个新类Lock的好处是什么(它基本上扩展了Object并且什么都不做)?
或者说,他们为什么不简单地使用private static Lock lock = new Object();?
以下代码:
synchronized(lock){
}
实际上并没有使用这些Lock机制,你只是使用内置的同步功能Object.在这种情况下,你也可以使用普通的旧版本Object.扩展的锁定对象的好处Object是它在调试工具中显示的是类名而不仅仅是普通的Object,这在追捕死锁时更有用.
请参阅此处了解LockAPI.
好处Lock是您可以获得更多功能,例如能够"尝试"锁定,然后在失败时继续执行代码.此外,它具有与同步块不同的属性,因为它不可重入(线程无法在同一个锁上保存多个锁,然后释放它们).如果你想要这样的东西,你就可以使用ReentrantLock.
你也有冷却器锁,例如ReentrantReadWriteLock,它支持多个读卡器,但只要作者锁定它,就不允许读者使用.对于不同类型的应用程序,有一个很大的锁定生态系统.
| 归档时间: | 
 | 
| 查看次数: | 480 次 | 
| 最近记录: |