Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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 Android:如何以正确的方式同步资源_Java_Android_Multithreading_File_Synchronized - Fatal编程技术网

Java Android:如何以正确的方式同步资源

Java Android:如何以正确的方式同步资源,java,android,multithreading,file,synchronized,Java,Android,Multithreading,File,Synchronized,我的应用程序有时应该读写文件。这项工作可能发生在多线程中,所以我应该同步这些资源。这是我的密码: // write to file FileOutputStream fos = openFileOutput("data.dat", Context.MODE_PRIVATE); synchronized (fos) { ObjectOutputStream writer = new ObjectOutputStream(fos); // continue to w

我的应用程序有时应该读写文件。这项工作可能发生在多线程中,所以我应该同步这些资源。这是我的密码:

// write to file
FileOutputStream fos = openFileOutput("data.dat", Context.MODE_PRIVATE);
synchronized (fos) {
     ObjectOutputStream writer = new ObjectOutputStream(fos);       
     // continue to write
}

// read to file
FileInputStream fis = openFileInput("data.dat");
synchronized (fis) {
    ObjectInputStream reader = new ObjectInputStream(fis);
    // continue to read
}
以上代码安全吗?这意味着“data.dat”始终只能在一个线程中读取或写入数据?如果错了,请帮我改正


谢谢:)

使用文件锁定:告诉其他线程输出文件正在使用中。如果输出文件仅由您的应用程序使用,则
synchronized
应防止其他线程同时执行该部分代码。或者,最后,你可以考虑使用<代码> ItnService < /代码>来排队请求并逐一处理< /P>。有2个问题:2个锁不相同,因此读写文件不是互斥的。更重要的是,您似乎在使用局部变量作为锁,这完全违背了目的:每个线程将有一个不同的锁,并发访问将不会被阻止。@assylia那么,您能推荐一些想法吗。我不能只同步该方法,因为可能另一个线程可以访问这些资源,而不使用这些方法。谢谢:)假设这些是实例方法(即非静态),您可以声明一个
private final Object lock=new Object()并将其用作锁。这样,所有线程对这两部分代码的所有访问都将是独占的。如果我使用
FileLock
,不同的线程和进程都将等待资源解锁,对吗?或者,他们会抛出异常?谢谢:)这取决于您的实现,因为锁是您的代码需要处理的东西。您只需尝试获得对特定资源(即文件)的锁定,如果您获得该锁定,则执行任务,然后释放该锁定。如果无法获得锁,则可以等待并重试,或抛出异常或执行其他操作。这取决于你