我创建了一个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);
}
答案 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));
}
}