如何使用java同步文件操作?同步还是锁定?

时间:2017-07-21 17:07:06

标签: java multithreading concurrency readwritelock reentrantreadwritelock

我创建了一个使用JSCH库读取和写入远程位置属性文件的应用程序。

我想同步写操作。

这是我的代码,

class WebApp{
    private String webappName;
    private boolean isQA = false;
    private String path ;

    public WebApp(String name , String  path , boolean isQA){
        this.webappName = name;
        this.path = path;
        this.isQA  = isQA;
    }
    public String getWebappName() {
        return webappName;
    }
    public void setWebappName(String webappName) {
        this.webappName = webappName;
    }
    public boolean isQA() {
        return isQA;
    }
    public void setQA(boolean isQA) {
        this.isQA = isQA;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
}

class WebAppProperty implements Runnable{

    private WebApp webapp; // webapp-1
    private String propertyFile; // server.properties
    private String keyValue;

    public String getPropertyFile() {
        return propertyFile;
    }
    public void setPropertyFile(String propertyFile) {
        this.propertyFile = propertyFile;
    }

    @Override
    public void run(){
        writeToPropertyFile();
    }
    public WebAppProperty(WebApp webapp , String propertyFile,String keyValue){
        this.webapp  = webapp;
        this.propertyFile = propertyFile;
        this.keyValue = keyValue;

    }

    private void writeToPropertyFile(){
        try{
            // code  for writing key value pair into remote file
        }catch (Exception e) {

        }
    }

}

这就是我想要的

  • 如果用户尝试写入Web应用中的属性文件说'A',则尝试写入同一webapp的同一文件的所有其他用户应该等待,但是另一个用户可以写入另一个文件在另一个webapp上使用相同的Web应用程序或同名文件。

    同步方法可以完成所有这些工作吗?如何识别webapp和属性文件?

我们是否需要同步读写操作?

如何在这种情况下实施锁定?

注意:我已经看到了关于并发性的不同问题,但是我不怀疑这就是为什么我要问新问题,请帮我澄清一下这个问题

1 个答案:

答案 0 :(得分:0)

按如下方式编写Webapp类:

class final WebApp{
private final String webappName;
private final boolean isQA = false;
private final String path ;

public WebApp(String name , String  path , boolean isQA){
    this.webappName = name;
    this.path = path;
    this.isQA  = isQA;
}
public String getWebappName() {
    return webappName;
}

public boolean isQA() {
    return isQA;
}

public String getPath() {
    return path;
}    

}

按如下方式编写webappProperty类:

class final WebAppProperty implements Runnable{

private final WebApp webapp; // webapp-1
private  finalString propertyFile; // server.properties
private final String keyValue;

public String getPropertyFile() {
    return propertyFile;
}    

@Override
public void run(){
    writeToPropertyFile();
}
public WebAppProperty(WebApp webapp , String propertyFile,String keyValue){
    this.webapp  = webapp;
    this.propertyFile = propertyFile;
    this.keyValue = keyValue;

}

private void writeToPropertyFile(){
    try{
        // code  for writing key value pair into remote file
    }catch (Exception e) {

    }
}

}

如果使用此方法,则无需使用synchronized。这两个类都是不可变类。不可变引用可以在多线程环境中自由共享而无需任何同步。这是因为一旦创建了不可变,它就会在对象的生命周期中被冻结。您在对象上所需的任何更改只能通过创建新对象来实现。

请注意,如果您不按上述方法创建不可变类,则必须在webapp类的所有方法中使用synchronized,因为无论您使用哪种方法,都需要保护共享可变状态。同上二等。