问题描述
package learn;import java.util.concurrent.Semaphore;class applePlate{static Semaphore apple = new Semaphore(2);static Semaphore space = new Semaphore(3);}class Eater implements Runnable{String name;Object o;Eater(String name, Object o){this.name = name;this.o = o;}public void run(){int count = 4;while(count-- > 0){try{applePlate.apple.acquire();}catch(InterruptedException e){throw new RuntimeException(e);}applePlate.space.release();System.out.println("Eater " + name +" eat"+" :left " + applePlate.apple.availablePermits());}}}class Producer implements Runnable{String name;Object o;Producer(String name, Object o){this.name = name;this.o = o;}public void run(){int count = 3;while(count-- > 0){try{applePlate.space.acquire();}catch(InterruptedException e){throw new RuntimeException(e);}applePlate.apple.release();System.out.println("Producer " + name +" produce"+" :left " + applePlate.apple.availablePermits());}}}class Go {public static void main(String args[]){Object o = new Object();Eater e1 = new Eater("eee", o), e2 = new Eater("eee2", o);Producer p1 = new Producer("ppp", o), p2 = new Producer("ppp2", o);Thread th1 = new Thread(e1);Thread th2 = new Thread(e2);Thread th3 = new Thread(p1);Thread th4 = new Thread(p2);th1.start();th2.start();th3.start();th4.start();}}
解决方案
信号量只是在信号不够的时候挂起线程,但是并不能保证信号量足够的时候获取对象和返还对象是线程安全的。所以你还需要有Lock来保证并发的正确性。
解决方案二:
"并不能保证信号量足够的时候获取对象和返还对象是线程安全的" 这是哪家的Java Doc声明的?