在Java线程中同步
我的程序是一个连接到多个服务器的客户端。我将连接对象保存到静态映射对象中的所有服务器: 服务器1->连接1在Java线程中同步,java,thread-safety,Java,Thread Safety,我的程序是一个连接到多个服务器的客户端。我将连接对象保存到静态映射对象中的所有服务器: 服务器1->连接1 服务器2->连接2 服务器->连接 我有许多线程从这个映射获取连接,以便与服务器通信。如何确保连接一次只能由一个线程使用 例如,我想确定线程1和线程2不能同时使用连接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)));
}