Singleton Runnable中的奇怪双重记录

时间:2014-06-05 14:51:44

标签: java multithreading logging singleton slf4j

我有这段代码:

public enum Something {
    INSTANCE;

    private static final Logger LOGGER = LoggerFactory.getLogger(Something.class);

    private Something() {
        Thread testThread = new Thread(new Runnable() {
            @Override
            public void run() {
                // do something
                LOGGER.info("TESTTHREAD: This should only appear once!");
            }
        });
        testThread.setName("TestThread");
        testThread.start();
    }
}

当我跑

Something.INSTANCE.getClass();

记录的内容(具有完全相同的时间戳)是:

TESTTHREAD: This should only appear once!
TESTTHREAD: This should only appear once!

有没有人见过这样的事情,或者知道会发生什么事?

2 个答案:

答案 0 :(得分:2)

我认为你看到的是appender可加性的结果。我假设你有一个带有appender-ref的ROOT记录器和一个单独的记录器(对于你的班级)也有一个appender-ref。默认情况下,Appender是继承的,因此通过子记录器发送的任何日志语句都将是子项的appender和父项的appender。您要执行的操作是将子记录器的additivity属性设置为false来禁用此功能。

答案 1 :(得分:0)

当我运行时

import java.util.logging.Logger;

public class Main {
    enum Singleton {
        INSTANCE;

        private static final Logger LOGGER = Logger.getLogger(Singleton.class.getName());

        Singleton() {
            Thread testThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    LOGGER.info("Print only once");
                }
            });
            testThread.start();
        }
    }

    public static void main(String... ignored) {
        Singleton.INSTANCE.toString();
    }
}

我只得到

Jun 05, 2014 10:03:08 AM Main$Singleton$1 run
INFO: Print only once