同步无法正常进行-新线程进入同步块,而不是对其进行锁定

我是多线程技术的新手,我正在尝试同步来自方法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();
}
hyqgxnxu 回答:同步无法正常进行-新线程进入同步块,而不是对其进行锁定

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3143492.html

大家都在问