當(dāng)消費(fèi)者遠(yuǎn)多于生產(chǎn)者的時(shí)候,使用ReentrantLock會(huì)出現(xiàn)數(shù)組越界
package xyz.hans.learning_java.pro_cu.lock;import xyz.hans.learning_java.pro_cu.common.IResource;import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;/*** Created by Hans on 16/10/22.*/ public class Resource implements IResource { private List<String> mRes; private static final int MAX = 20; private static final Lock mLock = new ReentrantLock(true); private static final Condition mEmptyCondition = mLock.newCondition(); private static final Condition mFullCondition = mLock.newCondition();public Resource() { mRes = new LinkedList<>(); } public String getRes() { mLock.lock(); if (mRes.size() <= 0) { //空倉(cāng)的事后 則獲取鎖并且等待 try { System.out.println("空倉(cāng)"); mEmptyCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("獲取資源:" + mRes.get(0)); String res = mRes.remove(0); mFullCondition.signalAll(); mLock.unlock(); return res; }public void addRes(String res) { mLock.lock(); if (mRes.size() >= MAX) { try { System.out.println("爆倉(cāng)"); mFullCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("添加資源:" + res); mRes.add(res); mEmptyCondition.signalAll(); mLock.unlock(); } }
Resource res = new Resource(); for (int i = 1; i < 3; i++) { new Productor("生產(chǎn)者:" + i, res).start(); } for (int i = 1; i < 200; i++) { new Customer("消費(fèi)者:" + i, res).start(); }
2個(gè)生產(chǎn)者線程199個(gè)消費(fèi)者線程
生產(chǎn)者:1生產(chǎn)了0號(hào)資源 生產(chǎn)者:2生產(chǎn)了0號(hào)資源 添加資源:生產(chǎn)者:1的0號(hào)資源 生產(chǎn)者:1生產(chǎn)了1號(hào)資源 添加資源:生產(chǎn)者:2的0號(hào)資源 生產(chǎn)者:2生產(chǎn)了1號(hào)資源 添加資源:生產(chǎn)者:1的1號(hào)資源 生產(chǎn)者:1生產(chǎn)了2號(hào)資源 添加資源:生產(chǎn)者:2的1號(hào)資源 生產(chǎn)者:2生產(chǎn)了2號(hào)資源 添加資源:生產(chǎn)者:1的2號(hào)資源 生產(chǎn)者:1生產(chǎn)了3號(hào)資源 添加資源:生產(chǎn)者:2的2號(hào)資源 添加資源:生產(chǎn)者:1的3號(hào)資源 生產(chǎn)者:2生產(chǎn)了3號(hào)資源 生產(chǎn)者:1生產(chǎn)了4號(hào)資源 添加資源:生產(chǎn)者:2的3號(hào)資源 生產(chǎn)者:2生產(chǎn)了4號(hào)資源 添加資源:生產(chǎn)者:1的4號(hào)資源 生產(chǎn)者:1生產(chǎn)了5號(hào)資源 添加資源:生產(chǎn)者:2的4號(hào)資源 生產(chǎn)者:2生產(chǎn)了5號(hào)資源 添加資源:生產(chǎn)者:1的5號(hào)資源 生產(chǎn)者:1生產(chǎn)了6號(hào)資源 添加資源:生產(chǎn)者:2的5號(hào)資源 生產(chǎn)者:2生產(chǎn)了6號(hào)資源 添加資源:生產(chǎn)者:1的6號(hào)資源 生產(chǎn)者:1生產(chǎn)了7號(hào)資源 添加資源:生產(chǎn)者:2的6號(hào)資源 生產(chǎn)者:2生產(chǎn)了7號(hào)資源 添加資源:生產(chǎn)者:1的7號(hào)資源 生產(chǎn)者:1生產(chǎn)了8號(hào)資源 添加資源:生產(chǎn)者:2的7號(hào)資源 生產(chǎn)者:2生產(chǎn)了8號(hào)資源 添加資源:生產(chǎn)者:1的8號(hào)資源 生產(chǎn)者:1生產(chǎn)了9號(hào)資源 添加資源:生產(chǎn)者:2的8號(hào)資源 生產(chǎn)者:2生產(chǎn)了9號(hào)資源 獲取資源:生產(chǎn)者:1的0號(hào)資源 消費(fèi)者:1消費(fèi)者消耗資源:生產(chǎn)者:1的0號(hào)資源 添加資源:生產(chǎn)者:1的9號(hào)資源 生產(chǎn)者:1生產(chǎn)了10號(hào)資源 添加資源:生產(chǎn)者:2的9號(hào)資源 生產(chǎn)者:2生產(chǎn)了10號(hào)資源 獲取資源:生產(chǎn)者:2的0號(hào)資源 消費(fèi)者:2消費(fèi)者消耗資源:生產(chǎn)者:2的0號(hào)資源 添加資源:生產(chǎn)者:1的10號(hào)資源 生產(chǎn)者:1生產(chǎn)了11號(hào)資源 獲取資源:生產(chǎn)者:1的1號(hào)資源 消費(fèi)者:3消費(fèi)者消耗資源:生產(chǎn)者:1的1號(hào)資源 添加資源:生產(chǎn)者:2的10號(hào)資源 生產(chǎn)者:2生產(chǎn)了11號(hào)資源 獲取資源:生產(chǎn)者:2的1號(hào)資源 消費(fèi)者:4消費(fèi)者消耗資源:生產(chǎn)者:2的1號(hào)資源 添加資源:生產(chǎn)者:1的11號(hào)資源 生產(chǎn)者:1生產(chǎn)了12號(hào)資源 添加資源:生產(chǎn)者:2的11號(hào)資源 生產(chǎn)者:2生產(chǎn)了12號(hào)資源 獲取資源:生產(chǎn)者:1的2號(hào)資源 消費(fèi)者:5消費(fèi)者消耗資源:生產(chǎn)者:1的2號(hào)資源 獲取資源:生產(chǎn)者:2的2號(hào)資源 消費(fèi)者:6消費(fèi)者消耗資源:生產(chǎn)者:2的2號(hào)資源 添加資源:生產(chǎn)者:1的12號(hào)資源 生產(chǎn)者:1生產(chǎn)了13號(hào)資源 添加資源:生產(chǎn)者:2的12號(hào)資源 生產(chǎn)者:2生產(chǎn)了13號(hào)資源 獲取資源:生產(chǎn)者:1的3號(hào)資源 消費(fèi)者:7消費(fèi)者消耗資源:生產(chǎn)者:1的3號(hào)資源 獲取資源:生產(chǎn)者:2的3號(hào)資源 消費(fèi)者:8消費(fèi)者消耗資源:生產(chǎn)者:2的3號(hào)資源 添加資源:生產(chǎn)者:1的13號(hào)資源 生產(chǎn)者:1生產(chǎn)了14號(hào)資源 添加資源:生產(chǎn)者:2的13號(hào)資源 生產(chǎn)者:2生產(chǎn)了14號(hào)資源 獲取資源:生產(chǎn)者:1的4號(hào)資源 消費(fèi)者:9消費(fèi)者消耗資源:生產(chǎn)者:1的4號(hào)資源 獲取資源:生產(chǎn)者:2的4號(hào)資源 消費(fèi)者:10消費(fèi)者消耗資源:生產(chǎn)者:2的4號(hào)資源 添加資源:生產(chǎn)者:1的14號(hào)資源 生產(chǎn)者:1生產(chǎn)了15號(hào)資源 獲取資源:生產(chǎn)者:1的5號(hào)資源 消費(fèi)者:11消費(fèi)者消耗資源:生產(chǎn)者:1的5號(hào)資源 添加資源:生產(chǎn)者:2的14號(hào)資源 生產(chǎn)者:2生產(chǎn)了15號(hào)資源 獲取資源:生產(chǎn)者:2的5號(hào)資源 消費(fèi)者:12消費(fèi)者消耗資源:生產(chǎn)者:2的5號(hào)資源 獲取資源:生產(chǎn)者:1的6號(hào)資源 消費(fèi)者:13消費(fèi)者消耗資源:生產(chǎn)者:1的6號(hào)資源 添加資源:生產(chǎn)者:1的15號(hào)資源 生產(chǎn)者:1生產(chǎn)了16號(hào)資源 獲取資源:生產(chǎn)者:2的6號(hào)資源 消費(fèi)者:14消費(fèi)者消耗資源:生產(chǎn)者:2的6號(hào)資源 添加資源:生產(chǎn)者:2的15號(hào)資源 生產(chǎn)者:2生產(chǎn)了16號(hào)資源 獲取資源:生產(chǎn)者:1的7號(hào)資源 消費(fèi)者:15消費(fèi)者消耗資源:生產(chǎn)者:1的7號(hào)資源 添加資源:生產(chǎn)者:1的16號(hào)資源 生產(chǎn)者:1生產(chǎn)了17號(hào)資源 獲取資源:生產(chǎn)者:2的7號(hào)資源 消費(fèi)者:16消費(fèi)者消耗資源:生產(chǎn)者:2的7號(hào)資源 添加資源:生產(chǎn)者:2的16號(hào)資源 生產(chǎn)者:2生產(chǎn)了17號(hào)資源 獲取資源:生產(chǎn)者:1的8號(hào)資源 消費(fèi)者:17消費(fèi)者消耗資源:生產(chǎn)者:1的8號(hào)資源 添加資源:生產(chǎn)者:1的17號(hào)資源 生產(chǎn)者:1生產(chǎn)了18號(hào)資源 獲取資源:生產(chǎn)者:2的8號(hào)資源 消費(fèi)者:18消費(fèi)者消耗資源:生產(chǎn)者:2的8號(hào)資源 添加資源:生產(chǎn)者:2的17號(hào)資源 生產(chǎn)者:2生產(chǎn)了18號(hào)資源 獲取資源:生產(chǎn)者:1的9號(hào)資源 消費(fèi)者:19消費(fèi)者消耗資源:生產(chǎn)者:1的9號(hào)資源 添加資源:生產(chǎn)者:1的18號(hào)資源 生產(chǎn)者:1生產(chǎn)了19號(hào)資源 獲取資源:生產(chǎn)者:2的9號(hào)資源 消費(fèi)者:20消費(fèi)者消耗資源:生產(chǎn)者:2的9號(hào)資源 獲取資源:生產(chǎn)者:1的10號(hào)資源 消費(fèi)者:21消費(fèi)者消耗資源:生產(chǎn)者:1的10號(hào)資源 添加資源:生產(chǎn)者:2的18號(hào)資源 生產(chǎn)者:2生產(chǎn)了19號(hào)資源 獲取資源:生產(chǎn)者:2的10號(hào)資源 消費(fèi)者:22消費(fèi)者消耗資源:生產(chǎn)者:2的10號(hào)資源 獲取資源:生產(chǎn)者:1的11號(hào)資源 消費(fèi)者:23消費(fèi)者消耗資源:生產(chǎn)者:1的11號(hào)資源 添加資源:生產(chǎn)者:1的19號(hào)資源 生產(chǎn)者:1生產(chǎn)了20號(hào)資源 獲取資源:生產(chǎn)者:2的11號(hào)資源 消費(fèi)者:24消費(fèi)者消耗資源:生產(chǎn)者:2的11號(hào)資源 獲取資源:生產(chǎn)者:1的12號(hào)資源 消費(fèi)者:25消費(fèi)者消耗資源:生產(chǎn)者:1的12號(hào)資源 添加資源:生產(chǎn)者:2的19號(hào)資源 生產(chǎn)者:2生產(chǎn)了20號(hào)資源 獲取資源:生產(chǎn)者:2的12號(hào)資源 消費(fèi)者:26消費(fèi)者消耗資源:生產(chǎn)者:2的12號(hào)資源 獲取資源:生產(chǎn)者:1的13號(hào)資源 消費(fèi)者:27消費(fèi)者消耗資源:生產(chǎn)者:1的13號(hào)資源 獲取資源:生產(chǎn)者:2的13號(hào)資源 消費(fèi)者:28消費(fèi)者消耗資源:生產(chǎn)者:2的13號(hào)資源 添加資源:生產(chǎn)者:1的20號(hào)資源 生產(chǎn)者:1生產(chǎn)了21號(hào)資源 獲取資源:生產(chǎn)者:1的14號(hào)資源 消費(fèi)者:29消費(fèi)者消耗資源:生產(chǎn)者:1的14號(hào)資源 獲取資源:生產(chǎn)者:2的14號(hào)資源 消費(fèi)者:30消費(fèi)者消耗資源:生產(chǎn)者:2的14號(hào)資源 添加資源:生產(chǎn)者:2的20號(hào)資源 生產(chǎn)者:2生產(chǎn)了21號(hào)資源 獲取資源:生產(chǎn)者:1的15號(hào)資源 消費(fèi)者:31消費(fèi)者消耗資源:生產(chǎn)者:1的15號(hào)資源 獲取資源:生產(chǎn)者:2的15號(hào)資源 消費(fèi)者:32消費(fèi)者消耗資源:生產(chǎn)者:2的15號(hào)資源 獲取資源:生產(chǎn)者:1的16號(hào)資源 消費(fèi)者:33消費(fèi)者消耗資源:生產(chǎn)者:1的16號(hào)資源 獲取資源:生產(chǎn)者:2的16號(hào)資源 消費(fèi)者:34消費(fèi)者消耗資源:生產(chǎn)者:2的16號(hào)資源 添加資源:生產(chǎn)者:1的21號(hào)資源 生產(chǎn)者:1生產(chǎn)了22號(hào)資源 獲取資源:生產(chǎn)者:1的17號(hào)資源 消費(fèi)者:35消費(fèi)者消耗資源:生產(chǎn)者:1的17號(hào)資源 獲取資源:生產(chǎn)者:2的17號(hào)資源 消費(fèi)者:36消費(fèi)者消耗資源:生產(chǎn)者:2的17號(hào)資源 獲取資源:生產(chǎn)者:1的18號(hào)資源 消費(fèi)者:37消費(fèi)者消耗資源:生產(chǎn)者:1的18號(hào)資源 添加資源:生產(chǎn)者:2的21號(hào)資源 生產(chǎn)者:2生產(chǎn)了22號(hào)資源 獲取資源:生產(chǎn)者:2的18號(hào)資源 消費(fèi)者:38消費(fèi)者消耗資源:生產(chǎn)者:2的18號(hào)資源 獲取資源:生產(chǎn)者:1的19號(hào)資源 消費(fèi)者:39消費(fèi)者消耗資源:生產(chǎn)者:1的19號(hào)資源 獲取資源:生產(chǎn)者:2的19號(hào)資源 消費(fèi)者:40消費(fèi)者消耗資源:生產(chǎn)者:2的19號(hào)資源 獲取資源:生產(chǎn)者:1的20號(hào)資源 消費(fèi)者:41消費(fèi)者消耗資源:生產(chǎn)者:1的20號(hào)資源 獲取資源:生產(chǎn)者:2的20號(hào)資源 消費(fèi)者:42消費(fèi)者消耗資源:生產(chǎn)者:2的20號(hào)資源 添加資源:生產(chǎn)者:1的22號(hào)資源 生產(chǎn)者:1生產(chǎn)了23號(hào)資源 獲取資源:生產(chǎn)者:1的21號(hào)資源 消費(fèi)者:43消費(fèi)者消耗資源:生產(chǎn)者:1的21號(hào)資源 獲取資源:生產(chǎn)者:2的21號(hào)資源 消費(fèi)者:44消費(fèi)者消耗資源:生產(chǎn)者:2的21號(hào)資源 獲取資源:生產(chǎn)者:1的22號(hào)資源 消費(fèi)者:45消費(fèi)者消耗資源:生產(chǎn)者:1的22號(hào)資源 空倉(cāng) 空倉(cāng) 添加資源:生產(chǎn)者:2的22號(hào)資源 生產(chǎn)者:2生產(chǎn)了23號(hào)資源 獲取資源:生產(chǎn)者:2的22號(hào)資源 消費(fèi)者:48消費(fèi)者消耗資源:生產(chǎn)者:2的22號(hào)資源 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) 添加資源:生產(chǎn)者:1的23號(hào)資源 生產(chǎn)者:1生產(chǎn)了24號(hào)資源 獲取資源:生產(chǎn)者:1的23號(hào)資源 消費(fèi)者:56消費(fèi)者消耗資源:生產(chǎn)者:1的23號(hào)資源 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) 空倉(cāng) Exception in thread "消費(fèi)者:46" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.LinkedList.checkElementIndex(LinkedList.java:553) at java.util.LinkedList.get(LinkedList.java:474) at xyz.hans.learning_java.pro_cu.lock.Resource.getRes(Resource.java:37)
為何在鎖的情況下還會(huì)產(chǎn)生這種問(wèn)題?
如何完美解決呢?
謝謝您的回復(fù)