package com.goldpac.ocs.common.devicemanageservice.mq;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReferenceArray;
public class LockFreeQueue {
private AtomicReferenceArray atomicReferenceArray;
//代表为空,没有元素
private static final Integer EMPTY = null;
//头指针,尾指针
AtomicInteger head,tail;
public LockFreeQueue(int size){
//指定空间
atomicReferenceArray = new AtomicReferenceArray(new Integer[size + 1]);
head = new AtomicInteger(0);
tail = new AtomicInteger(0);
}
/**
* 入队
* @param element
* @return
*/
public boolean add(List<user> element){
//尾部+1 % 长度 = 0为空
int index = (tail.get() + 1) % atomicReferenceArray.length();
if( index == head.get() % atomicReferenceArray.length()){
List<user> poll = poll();
poll.addAll(element);
add(poll);
if(poll.size() > 1){
poll();
System.out.println("存入!" + poll);
head = new AtomicInteger(0);
tail = new AtomicInteger(0);
}
return false;
}
while(!atomicReferenceArray.compareAndSet(index,EMPTY,element)){
return add(element);
}
tail.incrementAndGet(); //移动尾指针
System.out.println("入队成功!" + element);
return true;
}
/**
* 出队
* @return
*/
public List<user> poll(){
if(head.get() == tail.get()){
System.out.println("当前队列为空");
return null;
}
int index = (head.get() + 1) % atomicReferenceArray.length();
List<user> ele = (List<user>) atomicReferenceArray.get(index);
if(ele == null){ //有可能其它线程也在出队
return poll();
}
while(!atomicReferenceArray.compareAndSet(index,ele,EMPTY)){
return poll();
}
head.incrementAndGet();
System.out.println("出队成功!" + ele);
return ele;
}
public String print(){
StringBuffer buffer = new StringBuffer("[");
for(int i = 0; i < atomicReferenceArray.length() ; i++){
if(i == head.get() || atomicReferenceArray.get(i) == null){
continue;
}
buffer.append(atomicReferenceArray.get(i) + ",");
}
buffer.deleteCharAt(buffer.length() - 1);
buffer.append("]");
return buffer.toString();
}
public static void main(String[] args) throws InterruptedException {
List<user> list = new ArrayList<>();
List<user> list2 = new ArrayList<>();
List<user> list3 = new ArrayList<>();
List<user> list4 = new ArrayList<>();
user u = new user();
u.setId("111");
u.setName("name");
u.setPwd("pwd");
user u2 = new user();
u2.setId("222");
u2.setName("name2");
u2.setPwd("pwd2");
user u3 = new user();
u3.setId("333");
u3.setName("name3");
u3.setPwd("pwd3");
list.add(u);
list2.add(u2);
list3.add(u3);
list4.add(u2);
LockFreeQueue queue = new LockFreeQueue(1);
queue.add(list);
Thread.sleep(1000);
queue.add(list2);
Thread.sleep(1000);
queue.add(list3);
// queue.poll();
// queue.poll();
// queue.poll();
String print = queue.print();
System.out.println("队列内容:" +print);
System.out.println("队列内容:" +print.length());
//
// }
}
}
测试类
package com.goldpac.ocs.common.devicemanageservice.mq;
public class user {
private String id;
private String name;
private String pwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "user{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}