我正在尝试实现池模式,但是即使我在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();
}
}
}
}
}
因为notifyAll
和wait
都在使用同一锁的synchronized
块内,如果线程试图在不可用的情况下获取实例,则会死锁。
试图获取实例的线程获取了arr
的锁,然后等待。如果线程尝试释放实例,它将无法获取对arr
的锁定并阻塞,等待释放它,但是由于锁定线程正在等待通知,它永远不会释放。