java 多线程数组越界_java,多线程_Java消费者远多于生产者时候,产生数组越界问题?,java,多线程 - phpStudy...

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 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)

请求帮助

为何在锁的情况下还会产生这种问题?

如何完美解决呢?

谢谢您的回复

相关阅读:

为什么html文件一般都不压缩啊?

支付宝的支付异步通知能用一个地址吗 ?

laravel5.3如何实现获取最后一条插入的id

这个db.js里面的文件都是什么意思呀?

关于jquery.validate实时校验密码强度的问题!

封装ajax,发送post请求,FormData参数格式与jq的区别

vue +better-scroll 在手机上无法滚动

新浪微博返回的这种复杂的json数据应该怎么解析?

如何理解这段关于指针的代码

问一个nginx rewrite 问题,求解答,谢谢

vscode 提示一致显示正在加载,就是出不来。

css气泡,实现“倒三角(不知道算不算三角了)”可透明的。

关于ThinkPHP框架的学习??求大神支招

关于mac安装多个jdk?

laravel 的Eloquent ORM里$hidden的作用是什么?

各位大神,react可不可以实现点击一个按钮跳转到一个新的窗口?

Flask 在 windows 系统下该如何部署?

一个简单的装饰器例子报错

javascript事件执行多次

node的npm无法安装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值