Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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
JavaRMI同步_Java_Synchronization_Rmi - Fatal编程技术网

JavaRMI同步

JavaRMI同步,java,synchronization,rmi,Java,Synchronization,Rmi,我知道下面的代码中缺少了很多位,我的问题是关于RemoteImplementation中的同步机制。我还了解到在这个网站和其他网站上有一些关于RMI和同步的问题;在这里,我寻求明确的确认/矛盾 我的问题是:当我有几个客户端同时运行时,这是同步add方法调用的合理方法吗?也就是说,假设所有的ID都不同,那么当20个客户端在同时启动的不同机器上完成执行后,树集的大小是否会达到20000 public interface RemoteInterface extends Remote { voi

我知道下面的代码中缺少了很多位,我的问题是关于RemoteImplementation中的同步机制。我还了解到在这个网站和其他网站上有一些关于RMI和同步的问题;在这里,我寻求明确的确认/矛盾

我的问题是:当我有几个客户端同时运行时,这是同步add方法调用的合理方法吗?也就是说,假设所有的ID都不同,那么当20个客户端在同时启动的不同机器上完成执行后,树集的大小是否会达到20000

public interface RemoteInterface extends Remote {
    void add(String id) throws RemoteException;
}

public class RemoteImplemenation implements RemoteInterface{    
    TreeSet<String> ids = new TreeSet<String>();
    final Object lock = new Object();
    public void add(String id) {
        synchronized(lock) {
            ids.add(id);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        RemoteInterface remote = (RemoteInterface)Naming.lookup(...);
        for (int i=0;i<1000;i++) {
            remote.add(ipaddress+"_"+i);
        }
    }
}
公共接口RemoteInterface扩展了远程接口{
void add(字符串id)引发RemoteException;
}
公共类RemoteImplementation实现RemoteInterface{
树集ID=新树集();
最终对象锁=新对象();
公共无效添加(字符串id){
已同步(锁定){
添加(id);
}
}
}
公共类客户端{
公共静态void main(字符串[]args){
RemoteInterface remote=(RemoteInterface)命名.查找(…);

for(int i=0;i
synchronized
关键字将使显示的服务器代码以线程安全的方式执行,因此
ids
将包含20000项(除非输入中存在重复项,尽管这不太可能)。

这将起作用。您实际上不需要锁对象,可以直接在
ids
上进行同步