访问共享资源的线程数



在Java采访中,我被问到"在多线程中,应该做些什么才能使共享资源最多被4个线程访问?"有人知道吗?由于

你是说4个线程并发吗?还是总共4个线程?

如果是第一个选项(后者对我来说听起来毫无意义),您可以使用信号量(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html)

之类的
public class YourResource {
   private static final int MAX_CONCURRENT_THREADS = 4;
   private Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS ); 
   public void doSomethingWithYourResource() {
      semaphore.acquire();
      try {
         // Code accessed by 4 concurrent threads, tops
      } finally {
         semaphore.release();
      }
   }
}

使用线程池执行器创建最多4个线程

ExecutorService executor = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 4; i++) {
             Task task = new Task(someParam, someParam);
            executor.execute(task);
          }
        executor.shutdown();

其中task是某个共享资源的类。

为保护共享资源不被并发修改,需要同步共享资源。

我既不是java专家也不是多线程专家但我知道你可以使用newFixedThreadPool(int nThreads)这样的工厂方法来明确声明

在任何时候,最多有nThreads线程处于活动处理状态任务。

我的主要直觉是,正如@David Schwartz提到的,这只是一个选择主题和部署你的想法的问题。

最新更新