Java消費者遠多于生產者時候,產生數組越界問題??
問題描述
當消費者遠多于生產者的時候,使用ReentrantLock會出現數組越界
使用Lock實現的
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) { //空倉的事后 則獲取鎖并且等待 try { System.out.println("空倉"); 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("爆倉"); 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("生產者:" + i, res).start(); } for (int i = 1; i < 200; i++) { new Customer("消費者:" + i, res).start(); }
2個生產者線程199個消費者線程
Console面板日志
生產者:1生產了0號資源 生產者:2生產了0號資源 添加資源:生產者:1的0號資源 生產者:1生產了1號資源 添加資源:生產者:2的0號資源 生產者:2生產了1號資源 添加資源:生產者:1的1號資源 生產者:1生產了2號資源 添加資源:生產者:2的1號資源 生產者:2生產了2號資源 添加資源:生產者:1的2號資源 生產者:1生產了3號資源 添加資源:生產者:2的2號資源 添加資源:生產者:1的3號資源 生產者:2生產了3號資源 生產者:1生產了4號資源 添加資源:生產者:2的3號資源 生產者:2生產了4號資源 添加資源:生產者:1的4號資源 生產者:1生產了5號資源 添加資源:生產者:2的4號資源 生產者:2生產了5號資源 添加資源:生產者:1的5號資源 生產者:1生產了6號資源 添加資源:生產者:2的5號資源 生產者:2生產了6號資源 添加資源:生產者:1的6號資源 生產者:1生產了7號資源 添加資源:生產者:2的6號資源 生產者:2生產了7號資源 添加資源:生產者:1的7號資源 生產者:1生產了8號資源 添加資源:生產者:2的7號資源 生產者:2生產了8號資源 添加資源:生產者:1的8號資源 生產者:1生產了9號資源 添加資源:生產者:2的8號資源 生產者:2生產了9號資源 獲取資源:生產者:1的0號資源 消費者:1消費者消耗資源:生產者:1的0號資源 添加資源:生產者:1的9號資源 生產者:1生產了10號資源 添加資源:生產者:2的9號資源 生產者:2生產了10號資源 獲取資源:生產者:2的0號資源 消費者:2消費者消耗資源:生產者:2的0號資源 添加資源:生產者:1的10號資源 生產者:1生產了11號資源 獲取資源:生產者:1的1號資源 消費者:3消費者消耗資源:生產者:1的1號資源 添加資源:生產者:2的10號資源 生產者:2生產了11號資源 獲取資源:生產者:2的1號資源 消費者:4消費者消耗資源:生產者:2的1號資源 添加資源:生產者:1的11號資源 生產者:1生產了12號資源 添加資源:生產者:2的11號資源 生產者:2生產了12號資源 獲取資源:生產者:1的2號資源 消費者:5消費者消耗資源:生產者:1的2號資源 獲取資源:生產者:2的2號資源 消費者:6消費者消耗資源:生產者:2的2號資源 添加資源:生產者:1的12號資源 生產者:1生產了13號資源 添加資源:生產者:2的12號資源 生產者:2生產了13號資源 獲取資源:生產者:1的3號資源 消費者:7消費者消耗資源:生產者:1的3號資源 獲取資源:生產者:2的3號資源 消費者:8消費者消耗資源:生產者:2的3號資源 添加資源:生產者:1的13號資源 生產者:1生產了14號資源 添加資源:生產者:2的13號資源 生產者:2生產了14號資源 獲取資源:生產者:1的4號資源 消費者:9消費者消耗資源:生產者:1的4號資源 獲取資源:生產者:2的4號資源 消費者:10消費者消耗資源:生產者:2的4號資源 添加資源:生產者:1的14號資源 生產者:1生產了15號資源 獲取資源:生產者:1的5號資源 消費者:11消費者消耗資源:生產者:1的5號資源 添加資源:生產者:2的14號資源 生產者:2生產了15號資源 獲取資源:生產者:2的5號資源 消費者:12消費者消耗資源:生產者:2的5號資源 獲取資源:生產者:1的6號資源 消費者:13消費者消耗資源:生產者:1的6號資源 添加資源:生產者:1的15號資源 生產者:1生產了16號資源 獲取資源:生產者:2的6號資源 消費者:14消費者消耗資源:生產者:2的6號資源 添加資源:生產者:2的15號資源 生產者:2生產了16號資源 獲取資源:生產者:1的7號資源 消費者:15消費者消耗資源:生產者:1的7號資源 添加資源:生產者:1的16號資源 生產者:1生產了17號資源 獲取資源:生產者:2的7號資源 消費者:16消費者消耗資源:生產者:2的7號資源 添加資源:生產者:2的16號資源 生產者:2生產了17號資源 獲取資源:生產者:1的8號資源 消費者:17消費者消耗資源:生產者:1的8號資源 添加資源:生產者:1的17號資源 生產者:1生產了18號資源 獲取資源:生產者:2的8號資源 消費者:18消費者消耗資源:生產者:2的8號資源 添加資源:生產者:2的17號資源 生產者:2生產了18號資源 獲取資源:生產者:1的9號資源 消費者:19消費者消耗資源:生產者:1的9號資源 添加資源:生產者:1的18號資源 生產者:1生產了19號資源 獲取資源:生產者:2的9號資源 消費者:20消費者消耗資源:生產者:2的9號資源 獲取資源:生產者:1的10號資源 消費者:21消費者消耗資源:生產者:1的10號資源 添加資源:生產者:2的18號資源 生產者:2生產了19號資源 獲取資源:生產者:2的10號資源 消費者:22消費者消耗資源:生產者:2的10號資源 獲取資源:生產者:1的11號資源 消費者:23消費者消耗資源:生產者:1的11號資源 添加資源:生產者:1的19號資源 生產者:1生產了20號資源 獲取資源:生產者:2的11號資源 消費者:24消費者消耗資源:生產者:2的11號資源 獲取資源:生產者:1的12號資源 消費者:25消費者消耗資源:生產者:1的12號資源 添加資源:生產者:2的19號資源 生產者:2生產了20號資源 獲取資源:生產者:2的12號資源 消費者:26消費者消耗資源:生產者:2的12號資源 獲取資源:生產者:1的13號資源 消費者:27消費者消耗資源:生產者:1的13號資源 獲取資源:生產者:2的13號資源 消費者:28消費者消耗資源:生產者:2的13號資源 添加資源:生產者:1的20號資源 生產者:1生產了21號資源 獲取資源:生產者:1的14號資源 消費者:29消費者消耗資源:生產者:1的14號資源 獲取資源:生產者:2的14號資源 消費者:30消費者消耗資源:生產者:2的14號資源 添加資源:生產者:2的20號資源 生產者:2生產了21號資源 獲取資源:生產者:1的15號資源 消費者:31消費者消耗資源:生產者:1的15號資源 獲取資源:生產者:2的15號資源 消費者:32消費者消耗資源:生產者:2的15號資源 獲取資源:生產者:1的16號資源 消費者:33消費者消耗資源:生產者:1的16號資源 獲取資源:生產者:2的16號資源 消費者:34消費者消耗資源:生產者:2的16號資源 添加資源:生產者:1的21號資源 生產者:1生產了22號資源 獲取資源:生產者:1的17號資源 消費者:35消費者消耗資源:生產者:1的17號資源 獲取資源:生產者:2的17號資源 消費者:36消費者消耗資源:生產者:2的17號資源 獲取資源:生產者:1的18號資源 消費者:37消費者消耗資源:生產者:1的18號資源 添加資源:生產者:2的21號資源 生產者:2生產了22號資源 獲取資源:生產者:2的18號資源 消費者:38消費者消耗資源:生產者:2的18號資源 獲取資源:生產者:1的19號資源 消費者:39消費者消耗資源:生產者:1的19號資源 獲取資源:生產者:2的19號資源 消費者:40消費者消耗資源:生產者:2的19號資源 獲取資源:生產者:1的20號資源 消費者:41消費者消耗資源:生產者:1的20號資源 獲取資源:生產者:2的20號資源 消費者:42消費者消耗資源:生產者:2的20號資源 添加資源:生產者:1的22號資源 生產者:1生產了23號資源 獲取資源:生產者:1的21號資源 消費者:43消費者消耗資源:生產者:1的21號資源 獲取資源:生產者:2的21號資源 消費者:44消費者消耗資源:生產者:2的21號資源 獲取資源:生產者:1的22號資源 消費者:45消費者消耗資源:生產者:1的22號資源 空倉 空倉 添加資源:生產者:2的22號資源 生產者:2生產了23號資源 獲取資源:生產者:2的22號資源 消費者:48消費者消耗資源:生產者:2的22號資源 空倉 空倉 空倉 空倉 空倉 空倉 空倉 添加資源:生產者:1的23號資源 生產者:1生產了24號資源 獲取資源:生產者:1的23號資源 消費者:56消費者消耗資源:生產者:1的23號資源 空倉 空倉 空倉 空倉 空倉 空倉 Exception in thread "消費者: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)
請求幫助
為何在鎖的情況下還會產生這種問題?
如何完美解決呢?
謝謝您的回復
