public class semaphoreTest {
static LinkedList<Integer> integerLinkedList = new LinkedList<>();
static Semaphore semaphore = new Semaphore(1);
static Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
produce();
} catch (InterruptedException e) {
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
consume();
} catch (InterruptedException e) {
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
}
private static void produce() throws InterruptedException {
semaphore.acquire();
int value = 0;
while (true) {
while (integerLinkedList.size() == 10) {
semaphore.release();
}
integerLinkedList.add(value++);
}
}
private static void consume() throws InterruptedException {
semaphore.acquire();
while (true) {
while (integerLinkedList.size() == 0) {
semaphore.release();
}
//semaphore.release();
Integer value = integerLinkedList.removeFirst();
System.out.println("Size of the List is " + integerLinkedList.size() + " and value removed is " + value);
semaphore.release();
Thread.sleep(100);
}
}
}
이것은 제작자가 문제로 삼아 세마포어를 잠금으로 쓰려고합니다. 하지만 대략 240 개의 요소를 제거한 후에는 오류 메시지가 Maximum permit count exceeded
으로 나타납니다.최대 허용 개수 초과 : 세마포어
나는 올바른 위치에 자물쇠를 풀고 있지만, 그 부분을 획득 할 때 잘못된 점을 알아낼 수는 없습니다. 다음과 같이
오류 메시지는 다음과 같습니다
는Exception in thread "Thread-0" java.lang.Error: Maximum permit count exceeded
at java.util.concurrent.Semaphore$Sync.tryReleaseShared(Semaphore.java:192)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(AbstractQueuedSynchronizer.java:1341)
at java.util.concurrent.Semaphore.release(Semaphore.java:426)
at interviewQuestions.semaphoreTest.procude(semaphoreTest.java:53)
at interviewQuestions.semaphoreTest.access$000(semaphoreTest.java:12)
at interviewQuestions.semaphoreTest$1.run(semaphoreTest.java:23)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-1" java.lang.Error: Maximum permit count exceeded
at java.util.concurrent.Semaphore$Sync.tryReleaseShared(Semaphore.java:192)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(AbstractQueuedSynchronizer.java:1341)
at java.util.concurrent.Semaphore.release(Semaphore.java:426)
at interviewQuestions.semaphoreTest.consume(semaphoreTest.java:72)
at interviewQuestions.semaphoreTest.access$100(semaphoreTest.java:12)
at interviewQuestions.semaphoreTest$2.run(semaphoreTest.java:33)
at java.lang.Thread.run(Thread.java:745)
안녕하세요, 실제로 내 솔루션이 무한히 실행됩니다. 나는 내가 잠시 쉬었다고 약간의 실수를했다. 계속하는 대신에; . 당신은 무한히 달릴 때가있는 동안 (사실) 볼 수 있습니다. :)) 나는 매우 간단하기 때문에 당신의 produce() 메소드를 좋아합니다. 하지만 당신의 consume() 메소드는 잘못된 것으로 보인다. –