ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 咱们只须要使用这个,就能够不用使用synchronized同步关键字以及对应的notifyall方法和wait方法去写咱们的生产者消费者模式。 这样就能够大大简化咱们的代码html
Producer.javajava
package producterandcustomer; import java.util.List; import java.util.concurrent.locks.Lock; /** * @author StarsOne * @date Create in 2019-4-13 0013 14:51:21 * @description */ class Producter extends Thread { List<Object> warehouse; private String name; Lock lock; public Producter(List<Object> warehouse, String name, Lock lock) { this.warehouse = warehouse; this.name = "生产者" + name; //多态,ReentarntLock实现了Lock的接口,因此能够传进来 this.lock = lock; } @Override public void run() { while (true) { //加锁 lock.lock(); try { if (warehouse.size() < 10) { warehouse.add(new Object()); System.out.println(name + "生产1件" + "当前仓库有" + warehouse.size() + "件"); } } finally { //解锁 lock.unlock(); } try { sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Consumer.javaide
package producterandcustomer; import java.util.List; import java.util.concurrent.locks.Lock; /** * @author StarsOne * @date Create in 2019-4-13 0013 14:51:21 * @description */ class Cuotmer extends Thread{ List<Object> warehouse; private String name; Lock lock; public Cuotmer(List<Object> warehouse, String name, Lock lock) { this.warehouse = warehouse; this.name = "消费者"+name; this.lock = lock; } @Override public void run() { while (true) { //加锁 lock.lock(); try { if (warehouse.size() > 0) { warehouse.remove(0); System.out.println(name+"消费1件"+"当前仓库有"+warehouse.size()+"件"); } }finally { //最后释放 lock.unlock(); } try { sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }
Test.javathis
package producterandcustomer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author StarsOne * @date Create in 2019-4-13 0013 14:57:26 * @description */ class Test { public static void main(String[] args) { List<Object> warehouse = new ArrayList<>(); Lock lock = new ReentrantLock(); new Cuotmer(warehouse, "小米", lock).start(); new Cuotmer(warehouse, "小蓝", lock).start(); new Cuotmer(warehouse, "小浩", lock).start(); new Cuotmer(warehouse, "小家", lock).start(); new Cuotmer(warehouse, "小留", lock).start(); new Producter(warehouse, "小一", lock).start(); new Producter(warehouse, "小二", lock).start(); new Producter(warehouse, "小香", lock).start(); new Producter(warehouse, "小叫", lock).start(); new Producter(warehouse, "小三", lock).start(); } }
原文出处:https://www.cnblogs.com/stars-one/p/10710857.htmlspa