我有一个sinlgeton对象,它包含一个未同步的方法。单个用户可以一次访问单例 - 如果多个客户端访问该对象会发生什么? 实际上我想用这个方法在一个文件中写一个日志。
答案 0 :(得分:1)
我猜客户端,你的意思是线程。假设您已正确实现单例,所有线程将使用相同的实例。由于这是一种改变状态(写入文件)的方法,因此通常需要某种同步。虽然它取决于一些因素 - 例如,如果你的方法在一次调用BufferedWriter.write()中只写一行,那就没问题了。 Because BufferefWriter.write() does synchronization internally。但是,如果您编写多行或多次调用BufferedWriter.write(),则不同的调用可能无序执行。
现在,如果客户意味着不同的流程,简单的同步当然无济于事。如果进程位于同一JVM中,则可以使用FileLock锁定文件。否则,您必须使用外部锁定,例如使用另一个临时文件作为锁。如果它提供原子文件创建,它取决于操作系统。