有一个java应用程序说App1为每次运行创建一个新的日志文件,日志文件的名称是通过配置log4j.properties文件在运行时动态设置的。
jar这个java应用程序(App1)由另一个使用多线程的应用程序App2使用。 App2中的每个线程是否也都有自己的log4j.properties文件实例,在运行时更改log4j.properties是否可以线程安全?
对不起,我无法为我的问题提出更好的标题,如果你想到更好的想法,请编辑
答案 0 :(得分:0)
当你说"它自己的实例"时,目前还不清楚。
对我来说,您的App2应该在启动时解析您的log4j.properties,然后对其所有线程使用相同的参数,因此在运行时更改log4j.properties是安全的。
如果您希望能够在运行时更改log4j.properties并在运行时查看更改,则App2应在每次使用时重新解析该文件,即。每次启动一个线程来调用App1。在这里,每个线程都有自己的log4j.properties版本。
这会使线程不安全吗?我不这么认为,因为这是预期的行为,并且线程没有风险会出现错误的错误。" log4j.properties的副本,因为当您将log4j.properties文件保存到磁盘时,下次启动(App2)线程时,它将获得此新版本。但是,如果您同时保存文件""一个线程正在启动,该线程可能会获得旧版本,因为该文件可能尚未写入磁盘。
答案 1 :(得分:0)
log4j.properties通常仅在Log4j初始化期间读取一次。除非您重置配置并使Log4j重新读取该文件,否则将忽略启动后的任何更改。
如果您想绝对确定,请在此处共享您的Log4j初始化代码/配置以供我们检查。
答案 2 :(得分:0)
不,它不是线程安全的。如果在另一个在多个线程中创建(App1)对象的应用程序(App2)中访问它,则Log4J不会像互斥锁一样。你不能在这里有线程安全。
答案 3 :(得分:0)
对于你的APP2在APP2启动时只加载一次APP1的log4j,让app2的每个线程以同步的顺序访问同一个副本,否则它将不是线程安全的。