public void unregisterListener(Listener listener){
		listenerLock.lock();
		try{
			for(ListenerPriority priority : listeners.keySet()){
				Set<RegisteredEventListener> toRemove = new HashSet<RegisteredEventListener>();
					for(RegisteredEventListener regListener : listeners.get(priority)){
						if(regListener.getListener() == listener){
							toRemove.add(regListener);
						}
					}
					for(RegisteredEventListener regListener : toRemove){
						listeners.get(priority).remove(regListener);
					}
			}
		}finally{
			listenerLock.unlock();
		}
		monitorLock.lock();
		try{
			Set<RegisteredEventMonitor> toRemove = new HashSet<RegisteredEventMonitor>();
			for(RegisteredEventMonitor monitor : monitors){
				if(monitor.getListener() == listener){
					toRemove.add(monitor);
				}
			}
			for(RegisteredEventMonitor monitor : toRemove){
				monitors.remove(monitor);
			}
		}finally{
			monitorLock.unlock();
		}
	}