没有合适的资源?快使用搜索试试~ 我知道了~
二、编程题2实现一个线程安全的同步队列SyncQueue<T>,模拟多线程环境下的生产者消费者机制,SyncQueue<T>的定义如下: /** * 一个线程
资源详情
资源评论
资源推荐
请大家阅读文档时,在视图里勾选导航窗格,在左边显示章节目录方
便浏览。
一、编程题 1
下面程序是一个泛型容器 Container<T>的定义,该容器是对 ArrayList 的一个封装,实现
了四个公有的方法 add、remove、size、get。
class Container<T>{
private List<T> elements = new ArrayList<>();
/**
*
添加元素
* @param e
要添加的元素
*/
public void add(T e){
elements.add(e);
}
/**
*
删除指定下标的元素
* @param index
指定元素下标
* @return
被删除的元素
*/
public T remove(int index){
return elements.remove(index);
}
/**
*
获取容器里元素的个数
* @return
元素个数
*/
public int size(){
return elements.size();
}
/**
*
获取指定下标的元素
* @param index
指定下标
* @return
指定下标的元素
*/
public T get(int index){
return elements.get(index);
}
}
现在用如下程序对泛型容器进行测试。
public class Test {
public static void testAdd(){
Container<Integer> container = new Container<>();
int addLoops = 10; //addTask 内的循环次数
Runnable addTask = new Runnable() {
@Override
public void run() {
for(int i = 0; i < addLoops; i++){
container.add(i);
}
}
};
int addTaskCount = 100; //addTask 线程个数
ExecutorService es = Executors.newCachedThreadPool();
for(int i = 0; i < addTaskCount; i++){
es.execute(addTask);
}
es.shutdown();
while (!es.isTerminated()){}
System.out.println("Test add " + (addLoops * addTaskCount) +
" elements to container");
System.out.println("Container size = " + container.size() +
", correct size = " + (addLoops * addTaskCount));
}
public static void testRemove(){
Container<Integer> container = new Container<>();
int removeLoops = 10; //removeTask 内的循环次数
int removeTaskCount = 100; //removeTask 线程个数
//首先添加 removeLoops * removeTask 个元素到容器
for(int i = 0; i < removeLoops * removeTaskCount; i++){
container.add(i);
}
Runnable removeTask = new Runnable() {
@Override
public void run() {
for(int i = 0 ; i < removeLoops; i++){
container.remove(0);
}
}
};
ExecutorService es = Executors.newCachedThreadPool();
for(int i = 0; i < removeTaskCount; i++){
es.execute(removeTask);
}
es.shutdown();
while (!es.isTerminated()){}
System.out.println("Test remove " + (removeLoops * removeTaskCount) +
" elements from container");
System.out.println("Container size = " + container.size() +
", correct size = 0");
}
public static void main(String[] args){
testAdd();
testRemove();
}
}
1)请运行上面的测试程序来测试泛型 Container 是否是线程安全的,请分析 ArrayList 的 add
方法与 remove 方法的源代码,简单分析导致泛型 Container 不是线程安全的原因;
没有给 add 方法进行资源同步上锁,导致在添加过程中同时访问的 Arraylist 发生了线程不安
全的情况,导致了最终添加的数目和预期不相同。
2)请实现泛型 Container<T>的一个线程安全的版本 SynchronizedContainer<T>,只需要实现
与 Container<T>一样的 4 个公有方法。要求必须用 synchronized 同步语句块或 Lock 锁实现
class Container<T>{
private List<T> elements = new ArrayList<>();
/**
* 添加元素
* @param e 要添加的元素
*/
public synchronized void add(T e){
elements.add(e);
}
/**
剩余12页未读,继续阅读
村上树树825
- 粉丝: 20
- 资源: 292
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 6_Advertising-gd_LearningRate.ipynb
- BrushNet电商公司和摄影公司都在用的AI工作流
- 12_base.apk
- 520马上到了两款动态爱心表白HTML代码(附源码)李峋同款爱心,快送给你爱的她或(他)吧12 情侣纪念日代码.zip
- 电子设计竞赛的单相不间断电源设计
- cutcamera1715961370938.png
- 基于MATLAB的图像处理课程设计报告.doc
- tensorflow-gpu-2.6.0-cp38-cp38-manylinux2010-x86-64.whl
- mmexport1715960553858.png
- tensorflow-gpu-2.6.0-cp37-cp37m-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0