概述
在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
wait() / notify()方法
await() / signal()方法
BlockingQueue阻塞队列方法
PipedInputStream / PipedOutputStream
wait() / notify()方法
public class Storage {private final int MAX_SIZE = 100;private LinkedList<Object> list = new LinkedList<>();private synchronized void produce(String producer) {while (list.size() >= MAX_SIZE) {System.out.println("仓库已满,【" + producer + "】: 暂时不能执行生产任务!");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}list.add(new Object());this.notifyAll();}private synchronized void consume(String consumer) {while (list.size() == 0) {System.out.println("仓库已空,【" + consumer + "】: 暂时不能执行消费任务!");try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}list.remove();this.notifyAll();}
}public class Producer extends Thread {private String producer;private Storage storage;public Producer(Storage storage) {this.storage = storage;}@Overridepublic void run() {while (true) {produce(producer);}}public void produce(String producer) {storage.produce(producer);}public String getProducer() {return producer;}public void setProducer(String producer) {this.producer = producer;}public Storage getStorage() {return storage;}public void setStorage(Storage storage) {this.storage = storage;}}public class Consumer extends Thread {private String consumer;private Storage storage;public Consumer(Storage storage) {this.storage = storage;}@Overridepublic void run() {while (true) {consume(consumer);}}public void consume(String consumer) {storage.consume(consumer);}public Storage getStorage() {return storage;}public void setStorage(Storage storage) {this.storage = storage;}public String getConsumer() {return consumer;}public void setConsumer(String consumer) {this.consumer = consumer;}}
await() / signal()方法
public class StorageLock {private Lock lock = new ReentrantLock();private Condition fullCondition = lock.newCondition();private Condition emptyCondition = lock.newCondition();private final int MAX_SIZE = 10;private LinkedList<Object> list = new LinkedList<>();public void produce(String name) {try {lock.lock();while (list.size() == MAX_SIZE) {fullCondition.await();System.out.println("仓库已满," + name + "暂停生产");}list.add(new Object());System.out.println(name + "生产一个,当前仓库容量" + list.size());emptyCondition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void consume(String name) {try {lock.lock();while (list.size() == 0) {emptyCondition.await();System.out.println("仓库以空," + name + "暂停消费");}list.remove();System.out.println(name + "消费一个,当前仓库容量" + list.size());fullCondition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}
BlockingQueue阻塞队列方法
public class BlockStorage {private final int MAX_SIZE = 10;private ArrayBlockingQueue<Object> list = new ArrayBlockingQueue<Object>(MAX_SIZE);public void produce(String name) throws InterruptedException {if(list.size() == MAX_SIZE){System.out.println("仓库已满,【" + name + "】: 暂时不能执行生产任务!");}list.put(new Object());System.out.println("【" + name + "】:生产了一个产品\t【现仓储量为】:" + list.size());}public void consume(String name) throws InterruptedException {if(list.size() == 0){System.out.println("仓库空,【" + name + "】: 暂时不能执行消费任务!");}list.take();System.out.println("【" + name + "】:消费了一个产品\t【现仓储量为】:" + list.size());}}