Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步文件对象_Java_Synchronized - Fatal编程技术网

Java 同步文件对象

Java 同步文件对象,java,synchronized,Java,Synchronized,据我所知和研究,Java中的synchronized关键字允许同步方法或代码块语句来处理多线程访问。如果我想在多线程环境中锁定文件以供编写,我必须使用中的类来获得最佳结果。昨天,我提出了一个关于为文件I/O操作处理共享servlet的问题,BalusC注释对解决方案很有帮助,但其中的代码让我感到困惑。我不是在问社区“烧掉那篇文章”或“让我们否决他”(注意:我没有否决它或任何东西,我也没有反对答案),我是在问代码片段是否可以被认为是一个好的实践 private static File theFil

据我所知和研究,Java中的
synchronized
关键字允许同步方法或代码块语句来处理多线程访问。如果我想在多线程环境中锁定文件以供编写,我必须使用中的类来获得最佳结果。昨天,我提出了一个关于为文件I/O操作处理共享servlet的问题,BalusC注释对解决方案很有帮助,但其中的代码让我感到困惑。我不是在问社区“烧掉那篇文章”或“让我们否决他”(注意:我没有否决它或任何东西,我也没有反对答案),我是在问代码片段是否可以被认为是一个好的实践

private static File theFile = new File("theonetoopen.txt");

private void someImportantIOMethod(Object stuff){
    /*
        This is the line that confuses me. You can use any object as a lock, but
        is good to use a File object for this purpose?
    */
    synchronized(theFile) {
        //Your file output writing code here.
    }
}

问题不在于锁定一个文件对象——你可以锁定任何对象,但这并不重要(在某种程度上)

让我印象深刻的是,您使用的是一个非最终监视器,因此如果代码的另一部分重新分配了该文件:
theFile=newfile(),出现的下一个线程将使用另一个对象锁定,并且您不能保证您的代码不再由两个线程同时执行


如果文件是最终的,代码就可以了,不过最好使用专用监视器,以确保没有其他代码将其用于其他锁定目的。

您是否看到:
final Object lock=new Object()
您会问吗?

正如@assylias所指出的,问题在于锁在这里不是
final

Java中的每个对象都可以充当同步锁。它们被称为内在锁。一次只有一个线程可以执行由给定锁保护的代码块

关于这方面的更多信息:

对整个方法使用synchronized关键字可能会对应用程序的性能产生影响。这就是为什么有时可以使用同步块


您应该记住,锁引用是不能更改的。最好的解决方案是使用final关键字。

如果只需要在单个应用程序中锁定文件,那么就可以了(假设添加了
final

请注意,如果使用不同的类加载器多次加载该类,则解决方案将不起作用。例如,如果有一个web应用程序在同一个web服务器中部署了两次,则该应用程序的每个实例都有自己的锁对象


正如您所提到的,如果您希望锁定功能强大,并且文件也被其他程序锁定,那么您应该使用(参见文档,在某些系统上,并不能保证所有程序都必须遵守锁定)。

+1因为现在您已经超过4000人。@Hassan不管是谁,也不管它的名声如何,在你觉得这个问题/答案有帮助之前不要这样做。@Nandkumar我喜欢这个问题,我只是觉得它很有趣。@Luiggmendoza:你链接到的OP中的评论是什么意思
不要在Java Web应用程序中使用静态对象…
。我不知道你在说什么mean@user384706Java Web应用程序中的静态对象可能会导致内存泄漏,因为它们是在每次部署应用程序(加载类的位置)时创建的,但在取消部署应用程序时它们不会被释放,静态对象将保留在JVM中,直到您停止它,这意味着关闭Web应用服务器(Tomcat、JBoss或您使用的任何东西)。是的,我很确定,在这种情况下,锁是一个文件并不重要(除了缺少的
final
,正如你所说的)。如果说有什么问题的话,那就是混淆了代码,因为它暗示了JRE领域和文件系统领域之间的某种联系,而实际上(可能)没有。是的,
final
关键字将起到作用,正如文章中所述。让我困惑的是使用
文件
对象锁定代码块,实际上我对文件上的Java锁和OS锁感到困惑,但我猜这些锁是非常不同的。