-----记录坑自己的逻辑错误,一定不要有else。
---想当然的认为满了就不添加,满了是等待后续再次添加,需要恢复到原来的样子。
package com.mobile263;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/***
* 实现功能:实现一个固定大小的安全队列。
* @author ying
*
*/
public class SafeQueue {
//实现步骤:
// 1.要求大小固定
// 2,队列可抛出可压入
// 3 需要安全,即队列满了,不能再压入,
// 4 队列空的,即不能弹出.
// 5 在压入得时候不能取,否则脏读
private int lensize = 8;
private List<String> arryList = new ArrayList<String>();
// final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(arryList);
// private Queue<String> queue = new LinkedList<String>();
private Object lockObject = new Object();
public void put(String data) {
synchronized (lockObject) {
try {
if(arryList.size() == lensize) {
System.out.println("队列满了,请等待...");
lockObject.wait();
}
//这个地方不需要else,让线程恢复到原来的样子,依然能够加入。
arryList.add(data);
System.out.println("压入的数据为:" + data);
lockObject.notifyAll();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public String get () {
synchronized (lockObject) {
try {
if(arryList.isEmpty()) {
System.out.println("队列是空的,请等待....");
lockObject.wait();
}
//这个地方不需要else,让线程恢复到原来的样子,依然能够删除。
String data = arryList.get(0);
Iterator<String> iter = arryList.iterator();
while (iter.hasNext()) {
String item = iter.next();
if (item.equals(data)) {
iter.remove();
}
}
lockObject.notifyAll();
System.out.println("获取的数据为:" + data);
return data;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public static void main(String[] args) {
SafeQueue queue = new SafeQueue();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
queue.put("1");
queue.put("2");
queue.put("3");
queue.put("4");
queue.put("5");
queue.put("6");
queue.put("7");
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
queue.get();
queue.get();
queue.get();
queue.get();
queue.get();
queue.get();
queue.get();
}
},"t2");
t2.start();
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
t1.start();
}
}