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