Java 如何将第二个锁与Collections.synchronizedMap关联

Java 如何将第二个锁与Collections.synchronizedMap关联,java,concurrency,Java,Concurrency,我想在Collections.synchronizedMap类型的地图周围设置第二个锁。我怎样才能拥有它?不清楚您为什么要这样做,但基本上是这样的: private Map map = Collections.synchronizedMap(new HashMap()); private Object lock = new Object(); public void someMethod() { synchronized (lock) { // access map h

我想在Collections.synchronizedMap类型的地图周围设置第二个锁。我怎样才能拥有它?

不清楚您为什么要这样做,但基本上是这样的:

private Map map = Collections.synchronizedMap(new HashMap());
private Object lock = new Object();

public void someMethod() {
    synchronized (lock) {
        // access map here
    }
}

不清楚您为什么要这样做,但基本上是这样做的:

private Map map = Collections.synchronizedMap(new HashMap());
private Object lock = new Object();

public void someMethod() {
    synchronized (lock) {
        // access map here
    }
}
我做错了吗

这取决于您正在尝试做什么以及接下来的代码

您可能应该
最终解锁()。但是你必须问为什么你不想使用
synchronized
块(见@WhiteFang34的答案)

此外,如果您在关键部分中所做的一切都是在已经并发的映射上调用单个get,那么您不需要额外的锁

另一方面,如果您执行其他操作,那么首先可能不需要使用同步映射(其锁定不足)(如果可以在使用映射的所有位置使用外部锁定,则只需使用外部锁定)

总之,当同步块可以使用时,您不希望使用ReadWriteLock,也不希望在一个锁可以使用时使用两个锁(使用SynchronizedMap或应用程序级锁,但不能同时使用这两个锁)

我做错了吗

这取决于您正在尝试做什么以及接下来的代码

您可能应该
最终解锁()。但是你必须问为什么你不想使用
synchronized
块(见@WhiteFang34的答案)

此外,如果您在关键部分中所做的一切都是在已经并发的映射上调用单个get,那么您不需要额外的锁

另一方面,如果您执行其他操作,那么首先可能不需要使用同步映射(其锁定不足)(如果可以在使用映射的所有位置使用外部锁定,则只需使用外部锁定)


总之,当一个同步块可以使用时,您不想使用读写锁,也不想在一个块可以使用时使用两个锁(使用SynchronizedMap或应用程序级锁,但不能同时使用两者)。

第二个锁是什么意思?第二个锁是什么意思?私有读写锁mapLock=new ReentrantReadWriteLock();mapLock.writeLock().lock();尝试{final TableManagementInfo table=TABLES.get(mKey)..表是集合的地方。synchronizedMap.我做错了吗..我不能,因为这是一个非常大的体系结构,但现在需要在我的地图周围有一个第二个锁。我自己知道这不是一个好的解决方案,但仍然…:)@Saurabh Kumar,你不会使用带有同步锁的ReentrantReadWriteLock,因为这只会增加一倍的开销您只能使用ReentrantReadWriteLock或同步锁。@Saurabh Kumak,强制您使用第二个锁的具体要求是什么?private ReadWriteLock mapLock=new ReentrantReadWriteLock();mapLock.writeLock().lock();try{final TableManagementInfo table=TABLES.get(mKey)..表是集合的地方。synchronizedMap.我做错了吗..我不能,因为这是一个非常大的体系结构,但现在需要在我的地图周围有一个第二个锁。我自己知道这不是一个好的解决方案,但仍然…:)@Saurabh Kumar,你不会使用带有同步锁的ReentrantReadWriteLock,因为这只会增加一倍的开销您只能使用ReentrantReadWriteLock或同步锁。@Saurabh Kumak,强制您使用第二个锁的具体要求是什么?