public final class Connection
{
private Response;
int timeOut = 1000;
private SocketLink link; public synchcronized sendRequest(Request req){
response = null; link.write(req);//1
wait(timeOut);//2
if(response == null){
throw new SocketTimeoutException("Get a timeout exception");
} return response;
} public synchcronized setResponse(Response res){
this.response = res;
notifyAll();
}
}
位置1写入一个request后线程wait, 另外一个线程(记位thread2)会接收response, 然后调用setResponse并notify;现在的问题是: 一个线程在位置2处wait后会释放它所持有的this lock, 如果thread2还没有调用setResponse方法, 那么this lock是没有被任何线程占有的, 这时候sendRequest可以被另外的线程重入, 重置response=null就会出现问题;可能没有描述清楚, 我的意思是怎样保证sendRequest同时只被一个线程调用?
{
private Response;
int timeOut = 1000;
private SocketLink link; public synchcronized sendRequest(Request req){
response = null; link.write(req);//1
wait(timeOut);//2
if(response == null){
throw new SocketTimeoutException("Get a timeout exception");
} return response;
} public synchcronized setResponse(Response res){
this.response = res;
notifyAll();
}
}
位置1写入一个request后线程wait, 另外一个线程(记位thread2)会接收response, 然后调用setResponse并notify;现在的问题是: 一个线程在位置2处wait后会释放它所持有的this lock, 如果thread2还没有调用setResponse方法, 那么this lock是没有被任何线程占有的, 这时候sendRequest可以被另外的线程重入, 重置response=null就会出现问题;可能没有描述清楚, 我的意思是怎样保证sendRequest同时只被一个线程调用?
不知道你到底想实现什么样的逻辑,似乎程序不太合理
代码可以这样改:
.......
private int threadNum = 0;
public synchcronized sendRequest(Request req){
if(0 == threadNum) //当所有的线程都执行完成后才允许清理
response = null; link.write(req);//1
threadNum++;//等待线程数+1
wait(timeOut);//2
threadNum--; //正常完成后减去1
if(response == null){
throw new SocketTimeoutException("Get a timeout exception");
} return response;
}
.....
wait(timeOut);
}