我是否需要同步ExecutorService.execute()?

时间:2013-06-18 06:42:40

标签: java multithreading asynchronous threadpoolexecutor

我创建了一个Enum单例,如下所示:

public enum Logging {

    INSTANCE;   
        ExecutorService pool = Executors.newFixedThreadPool(4);
}

现在我正在使用此池在特定情况下异步记录。 调用代码如下所示:

Logging.INSTANCE.execute(new MyRunnable("LogType.A",logData));

MyRunnable对象的Run方法很简单,如下所示:

    public class MyRunnable {
        public MyRunnable(LogType logType,String logData){
           this.logType=logType;
           this.logData=logData;
        }  
        public void run() {
                switch(logType) {
                case A:         
                    logData(Logger.getLogger(A_LOG),logData);
                    break;
                case B:         
                    logData(Logger.getLogger(B_LOG,logData));
                    break;
        }

        private void logData (Logger logger,String logdata) {
        if(some condition)
         logger.info(logdata);
        else
         do something else;
        }
    }

现在,如果我向多个线程的队列提交大量请求,我的查询是否会遇到任何并发问题?不是executor.execute(任务)已经同步了或者我是否需要在synchronized方法中包装execute方法(在Logging枚举中)并调用下面的方法:

public synchronized  void submitTask(Runnable task) {       
    executor.execute(task);     
}

1 个答案:

答案 0 :(得分:2)

  

现在我的查询是否会在提交时遇到任何并发问题   有多个线程的队列请求很多?

无需使用synchronized。

public synchronized  void submitTask(Runnable task) {       
    executor.execute(task);     
}

即使在这里,删除synchronized也是安全的。

public enum Logger {
    INSTANCE;   

   ExecutorService pool = Executors.newFixedThreadPool(4);

   public void log(String logType, String logData){
       //you internally create a instance of your runnable and not leave on caller to create instance

      pool.execute(new MyRunnable(logType, logData));
   }
}