Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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_Thread Safety - Fatal编程技术网

在Java线程中同步

在Java线程中同步,java,thread-safety,Java,Thread Safety,我的程序是一个连接到多个服务器的客户端。我将连接对象保存到静态映射对象中的所有服务器: 服务器1->连接1 服务器2->连接2 服务器->连接 我有许多线程从这个映射获取连接,以便与服务器通信。如何确保连接一次只能由一个线程使用 例如,我想确定线程1和线程2不能同时使用连接1。我不完全确定您想要什么。我假设您希望保证一次只有一个线程访问一个特定的服务器 如果您的连接类似于套接字,那么您可以将其用作: 您还可以将逻辑放入连接的装饰器中。如果您的连接有多个发送或接收方法(例如,因为您使用更高的抽象级

我的程序是一个连接到多个服务器的客户端。我将连接对象保存到静态映射对象中的所有服务器:

服务器1->连接1
服务器2->连接2
服务器->连接

我有许多线程从这个映射获取连接,以便与服务器通信。如何确保连接一次只能由一个线程使用


例如,我想确定线程1和线程2不能同时使用连接1。

我不完全确定您想要什么。我假设您希望保证一次只有一个线程访问一个特定的服务器

如果您的连接类似于套接字,那么您可以将其用作:

您还可以将逻辑放入连接的装饰器中。如果您的连接有多个发送或接收方法(例如,因为您使用更高的抽象级别,如RMI),则这一点尤其有用:

如果您使用的是decorator方法,那么唯一需要更改的就是实例创建。而不是:

private void connect(key, connectionParams) {
  map.put(key, new ConnectionImpl(connectionParams));
}
使用


我不完全确定你想要什么。我假设您希望保证一次只有一个线程访问一个特定的服务器

如果您的连接类似于套接字,那么您可以将其用作:

您还可以将逻辑放入连接的装饰器中。如果您的连接有多个发送或接收方法(例如,因为您使用更高的抽象级别,如RMI),则这一点尤其有用:

如果您使用的是decorator方法,那么唯一需要更改的就是实例创建。而不是:

private void connect(key, connectionParams) {
  map.put(key, new ConnectionImpl(connectionParams));
}
使用


或者,在最初的示例中,get方法可以从映射中删除连接。当然,这意味着客户端必须确保(可能在
finally
块中,完成后再次调用add)


然后让wait和notify循环等待客户端请求连接时,它不在那里。

或者,在最初的示例中,get方法可以从映射中删除连接。当然,这意味着客户端必须确保(可能在
finally
块中,完成后再次调用add)


然后让等待和通知循环等待客户端请求连接,但它不在那里。

我的程序连接到许多服务器您使用服务器套接字作为服务器吗?@SjB:是的,但我关心客户端,而不是服务器server@QuanNH:显示您认为不起作用的代码properly@SjB好啊我已经编辑了我的postmy程序连接到许多服务器您使用serversocket作为服务器吗?@SjB:是的,但我关心客户端,而不是客户端server@QuanNH:显示您认为不起作用的代码properly@SjB好的,我已经编辑了我的帖子
public interface PowerfulConnection {
  public void doA();
  public int doB(ParameterForB param);
}

public class ConnectionImpl implements PowerfulConnection {
   // handles the actual connection
}

/**
 * This method is a decorator for PowerfulConnection that synchronizes all method accesses.
 */
public class SynchronizedConnection implements PowerfulConnection {
  private PowerfulConnection target;

  public SynchronizedConnection(PowerfulConnection target) {
    if (target == null) throw new NullPointerException();
    this.target = target;
  }

  public synchronized void doA() {
    target.doA();
  }

  public synchronized int doB(ParameterForB param) {
    return target.doB(param);
  }
}
private void connect(key, connectionParams) {
  map.put(key, new ConnectionImpl(connectionParams));
}
private void connect(key, connectionParams) {
  map.put(key, new SynchronizedConnection(new ConnectionImpl(connectionParams)));
}