golang多協程安全ArrayListConcurrent(源代碼)

為了方便對比,單協程中使用ArrayList和多協程中ArrayListConcurrent放在一起。

package code
import "sync"
type Array interface {
Ini();
Add(interface{}) bool;
Contains(interface{}) int;
Size() int;
Get(int) interface{};
Remove(int) interface{};
RemoveO(interface{}) bool;
}
type ArrayList struct {
Data []interface{};
}
func (this *ArrayList)Ini() {
this.Data=make([]interface{},0);
}
func (this *ArrayList) Add (i interface{}) bool {
this.Data=append(this.Data, i);
return true;
}
//判斷是否保存對象 -1 表示沒有對象
func (this *ArrayList) Contains(i interface{}) int {
var r int =-1;
out:for k,v:=range this.Data {
if(v==i){
r=k;
break out;
}
}
return r;
}
func (this *ArrayList) Size() int {
return len(this.Data);
}
func (this *ArrayList) Get(index int) interface{} {
var r interface{}=nil;
if(index>=0 && index r=this.Data[index];
}
return r;
}
//索引刪除
func (this *ArrayList) Remove(index int) interface{} {
var r interface{}=nil;
if(index>=0 && index if(index==0) {
r=this.Data[index];
this.Data = this.Data[1:len(this.Data)]
}else if(index==(len(this.Data)-1)){
r=this.Data[index];
this.Data = this.Data[0:len(this.Data)-1]
}else {
r=this.Data[index];
this.Data=append(this.Data[0:index],this.Data[index+1:len(this.Data)]...);
}
}
return r;
}
//對象刪除
func (this *ArrayList) RemoveO(i interface{}) bool {
var r int=-1;
out:for k,v:=range this.Data {
if(v==i){
r=k;
break out;
}
}
if(r>=0) {
this.Remove(r);
return true;
}else {
return false;
}
}






//併發對象
type ArrayListConcurrent struct {
Data []interface{};
lock *sync.Mutex
}
func (this *ArrayListConcurrent)Ini() {
this.Data=make([]interface{},0);
this.lock=new(sync.Mutex);
}
func (this *ArrayListConcurrent) Add (i interface{}) bool {
this.lock.Lock();
this.Data=append(this.Data, i);
this.lock.Unlock();
return true;
}
//判斷是否保存對象 -1 表示沒有對象
func (this *ArrayListConcurrent) Contains(i interface{}) int {
var r int =-1;
this.lock.Lock();
out:for k,v:=range this.Data {
if(v==i){
r=k;
break out;
}
}
this.lock.Unlock();
return r;
}
func (this *ArrayListConcurrent) Size() int {
return len(this.Data);
}
func (this *ArrayListConcurrent) Get(index int) interface{} {
var r interface{}=nil;
this.lock.Lock();
if(index>=0 && index r=this.Data[index];
}
this.lock.Unlock();
return r;
}
//索引刪除
func (this *ArrayListConcurrent) Remove(index int) interface{} {
var r interface{}=nil;
if(index>=0 && index this.lock.Lock();
if(index==0) {
r=this.Data[index];
this.Data = this.Data[1:len(this.Data)]
}else if(index==(len(this.Data)-1)){
r=this.Data[index];
this.Data = this.Data[0:len(this.Data)-1]
}else {
r=this.Data[index];
this.Data=append(this.Data[0:index],this.Data[index+1:len(this.Data)]...);
}
this.lock.Unlock();
}
return r;
}
//對象刪除
func (this *ArrayListConcurrent) RemoveO(i interface{}) bool {
var b bool=false;
this.lock.Lock();
var index int=-1;
out:for k,v:=range this.Data {
if(v==i){
index=k;
break out;
}
}
if(index>=0) {
if(index==0) {
this.Data = this.Data[1:len(this.Data)]
}else if(index==(len(this.Data)-1)){
this.Data = this.Data[0:len(this.Data)-1]
}else {
this.Data=append(this.Data[0:index],this.Data[index+1:len(this.Data)]...);
}
b=true;
}
this.lock.Unlock()
return b;
}


分享到:


相關文章: