[在Java中实现池模式时使用wait()和notify()

问题描述 投票:0回答:1

我正在尝试实现池模式,但是即使我在releaseInstance()方法中具有notifyAll(),也永远不会通知getInstance()中的wait()。我在操纵线程方面没有太多经验,因此我在这里的解决方案基于我可以从互联网上掌握的内容,而且似乎不起作用:)。

public class PoolsOfObjects {
    int size = 3;
    int counter = 0;
    int temp = 0;
    boolean checker = false;
    ServiceObject[] arr = new ServiceObject[size];
    public ServiceObject getInstance() throws InterruptedException {

        synchronized (arr) {
            while(counter>size) {
                System.out.println("wait begins");
                arr.wait();
            }
        }

        for(int i = 0; i<size; i++) {
            if(arr[i] != null) {
                return arr[i];
            }               
        }
        ServiceObject obj1 = new ServiceObject();
        counter++;
        return obj1;
    }


    public void releaseInstance(ServiceObject obj) {
        for(int i = 0; i<size; i++) {
            System.out.println(counter);
            if(arr[i] == null) {
                temp = i;
                arr[i] = obj;
                System.out.println(i+"->"+arr[i]);
                obj = null;
                counter--;
                synchronized (arr) {
                    System.out.println("break the wait");
                    arr.notifyAll();
                }
            }
        }
    }
}
java pool
1个回答
0
投票

因为notifyAllwait都在使用同一锁的synchronized块内,如果线程试图在不可用的情况下获取实例,则会死锁。

试图获取实例的线程获取了arr的锁,然后等待。如果线程尝试释放实例,它将无法获取对arr的锁定并阻塞,等待释放它,但是由于锁定线程正在等待通知,它永远不会释放。

© www.soinside.com 2019 - 2024. All rights reserved.