首页 > 解决方案 > Java - 在方法中允许一个线程而无需等待

问题描述

我有一种情况,我需要实现一个线程安全的方法,该方法一次只能由一个线程执行,并且当该方法由一个线程执行时,所有其他尝试执行相同方法的线程都应该' t 等待并且必须退出该方法。

同步在这里无济于事,因为线程将等待顺序执行该方法。

我想我可以通过使用下面的代码使用 ConcurrentHashMap 来实现这一点,但不确定这是否是实现它的完美方式。

Class Test {

private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

    public void execute() {
        
        if (map.putIfApsent("key", new Object()) != null) { // map has value for key which means a thread has already entered.
            return; // early exit
        }
        
        threadSafeMethod();
        map.remove("key");
    }
    
    private void threadSafeMethod() {
        // my code
    }
}

标签: javamultithreadingconcurrencysynchronizationsingle-threaded

解决方案


您可以在不同步的情况下执行此操作,使用布尔值进行比较和交换:

private AtomicBoolean entered = new AtomicBoolean(false);

public void execute() {
   if(entered.compareAndSet(false,true) {
      try {
         method()
      } finally {
         entered.set(false)
      }
   }
}

推荐阅读