public void Lock(){
		//FCNode myNode = (FCNode)myFCNode.get();
		
		FCNode MyFCNode = (FCNode)myFCNode.get();
		MyFCNode.canBeGlobalTail = false;
		//MyFCNode.isOwner = false;
		MyFCNode.isOwner.set(false);
		MyFCNode.requestReady = true;
		
		int myCluster = ((TestThread)Thread.currentThread()).getClusterId();
		int ThresHold = 1000;
		AtomicReference<FCQueue> myFCQ = localFCQueues.get(myCluster);
		FCQueue myFCQueue = myFCQ.get();
		
		//FCNode localHead = myFCQueue.LocalHead;
		//FCNode localTail = myFCQueue.LocalTail;
		
		while(true){
			if(!MyFCNode.isActive){
				//insert my item in local pl
				MyFCNode.isActive = true;
				MyFCNode.requestReady = true;
				AddNodeToPL(MyFCNode,myCluster);
				//System.out.println("added thread: "+ ((TestThread)Thread.currentThread()).getThreadId() );
			}
			
			if(myFCQueue.FCLock.get() == 0){
				if (myFCQueue.FCLock.compareAndSet(0, 1)){
					if(MyFCNode.requestReady){
						//for(int k = 0; k<10000;k++){}
						//System.out.println("combiner thread: "+ ((TestThread)Thread.currentThread()).getThreadId() );
						myFCQueue.count++; //increment passing count
						for (int i = 0; i<32 ; i++){ //for max combining iterations
							FCNode temp = (localFCQueues.get(myCluster).get()).FCHead.get();//get local pl
							FCNode tempPred = temp;
							boolean flag = false;
							while (temp!= null){
								if((temp.requestReady) && (temp != MyFCNode)){
									if (myFCQueue.LocalHead == null){
										myFCQueue.LocalHead = temp;
										myFCQueue.LocalTail = temp;
										temp.GLNext = null; //the first node in the localFClist
									}else{
										//System.out.println("combiner thread: "+ ((TestThread)Thread.currentThread()).getThreadId() );
										myFCQueue.LocalTail.GLNext = temp;
										myFCQueue.LocalTail = temp;
									}
									
									temp.age = myFCQueue.count;
									temp.requestReady = false;
								}else{
									if(myFCQueue.count - temp.age > ThresHold){
										if ((temp != MyFCNode))// & (temp != myFCQueue.FCHead))
										{
											//System.out.println("cleaner thread: "+ myFCNode +((TestThread)Thread.currentThread()).getThreadId() + " : "+myFCQueue.count+" : " + temp+ temp.age);
											temp.isActive = false;
											tempPred = temp.PLNext;
											flag = true;
										}
									}
								}
								if (!flag)tempPred = temp;
								else flag = false;
								temp = temp.PLNext;
							}
						}
						if (myFCQueue.LocalHead == null){
							myFCQueue.LocalHead = MyFCNode;
							myFCQueue.LocalTail = MyFCNode;
						}else{
							myFCQueue.LocalTail.GLNext = MyFCNode;
							myFCQueue.LocalTail = MyFCNode;
						}
						
						MyFCNode.canBeGlobalTail = true;
						MyFCNode.requestReady = false;
						
						FCNode prevTail = globalQueueTail.getAndSet(myFCQueue.LocalTail);
						if(prevTail != null){
							prevTail.canBeGlobalTail = false;
							prevTail.GLNext = myFCQueue.LocalHead;
						}else{
							//myFCQueue.LocalHead.isOwner = true;
							//combiner is local and global head in a lot of cases	
							((localFCQueues.get(myCluster)).get()).LocalHead.isOwner.set(true);
							//myFCQueue.LocalHead.isOwner.set(true);// = true;
						}
					}
					
					myFCQueue.FCLock.set(0);
				}
			}
			if (MyFCNode.requestReady == false){
				//System.out.println("ready thread: "+ ((TestThread)Thread.currentThread()).getThreadId() );
				break;
			}
		}
		while(!MyFCNode.isOwner.get()){}//{if (!MyFCNode.isActive) {AddNodeToPL(MyFCNode,myCluster);}}
		return;
	}