我是多线程技术的新手,我正在尝试同步来自方法addRequestToPool的多个请求, 每次在TicketRequestManagement类中都会创建一个新实例,并调用addRequestToPool方法,该方法将创建线程并进一步调用。
但是看起来当有多个请求addRequestToPool方法时,该方法将进一步调用syncnizeRequests线程未同步2线程将进入代码块,而不是下面的同步代码。
synchronized (this) {
while (hashMap.containsKey(docketNo)) {
wait();
}
hashMap.put(docketNo,1);
}
下面是完整的代码
TicketRequestManagement:
public class TicketRequestManagement {
private static Logger logger = Logger.getLogger(TicketRequestManagement.class);
public SimpleactionResponse addRequestToPool(int docketNo) throws InterruptedException {
logger.info("addRequestToPool started with Docket No : " + docketNo);
SimpleactionResponse response = new SimpleactionResponse();
RequestSynchronization requestSynchronization = new RequestSynchronization(docketNo);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
requestSynchronization.synchronizeRequests();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t1.join();
return response;
}
public SimpleactionResponse removeRequestFromPool(int docketNo) throws InterruptedException {
logger.info("removeRequestFromPool started with Docket No : " + docketNo);
SimpleactionResponse response = new SimpleactionResponse();
RequestSynchronization requestSynchronization = new RequestSynchronization(docketNo);
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
requestSynchronization.removeRequests();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
t2.join();
return response;
}
}
RequestSynchronization:
public class RequestSynchronization {
private static Logger logger = Logger.getLogger(RequestSynchronization.class);
private static ConcurrentHashMap<Integer,Integer> hashMap = new ConcurrentHashMap<>();
private int docketNo;
public RequestSynchronization(int docketNo) {
super();
this.docketNo = docketNo;
}
public void synchronizeRequests() throws InterruptedException {
synchronized (this) {
while (hashMap.containsKey(docketNo)) {
wait();
}
hashMap.put(docketNo,1);
}
}
public void removeRequests() throws InterruptedException {
synchronized (this) {
hashMap.remove(docketNo);
notify();
}
}
}
能否请您提出我在这里做错了什么,我也想知道变量docketNo的范围,对于每个请求,即使在等待或有某种效果后,它仍与线程保持同步在上面。
提前谢谢!
编辑1:
我已将访问级别更改为类级别锁定并发送类实例,而不是文件号,这是我的修改后的方法代码,但看来notify不能正常工作,现在不知道为什么:(
private final static Object lock = new Object();
public synchronized static void synchronizeRequests(RequestSynchronization requestSynchronization) throws InterruptedException {
while (hashMap.containsKey(requestSynchronization.getDocketNo())) {
lock.wait();
}
hashMap.put(requestSynchronization.getDocketNo(),requestSynchronization.getDocketNo());
}
public synchronized static void removeRequests(RequestSynchronization requestSynchronization) throws InterruptedException {
hashMap.remove(requestSynchronization.getDocketNo());
lock.notifyAll();
}