public void offer(T item) {
		if(item == null) {
			return;
		}
		
		synchronized(lock) {
			if(queue.size()>=capacity) {
				System.out.println("Reach maximum capacity...");
				return;
			}
			
			queue.offer(item);
			
			if(maxList.isEmpty()) {
				// if max list is empty, append it
				maxList.add(item);
			} else {
				// if not! 
				// Remove all the items in the max list 
				// which are smaller than insert one from the tail
				// and then add the insert one to the tail.
				while(!maxList.isEmpty()) {
					T tmpItem = maxList.get(maxList.size()-1);
					if(item.compareTo(tmpItem) > 0) {
						maxList.remove(maxList.size()-1);
					} else {
						break;
					}
				}
				maxList.add(item);
			}
			
			// same logic as maximum
			if(minList.isEmpty()) {
				minList.add(item);
			} else {
				while(!minList.isEmpty()) {
					T tmpItem = minList.get(minList.size()-1);
					if(item.compareTo(tmpItem) < 0) {
						minList.remove(minList.size()-1);
					} else {
						break;
					}
				}
				minList.add(item);
			}
		}
	}