package org.limewire.concurrent;
/**
* A synchronized reference of a given type that allows custom lock
* and exposes it for more flexible synchronization.
*/
public class SyncWrapper<T> {
private final Object lock;
private T value;
public SyncWrapper(T value, Object lock) {
this.lock = lock;
this.value = value;
}
public SyncWrapper(T value) {
this.value = value;
this.lock = this;
}
public SyncWrapper(){
this(null);
}
/**
* @return the current value of the reference
*/
public T get() {
synchronized(getLock()) {
return value;
}
}
/**
* @param newValue sets the reference to this value
*/
public void set(T newValue) {
synchronized(getLock()) {
value = newValue;
}
}
/**
* @return the lock used to synchronize the setting & getting.
*/
public Object getLock() {
return lock;
}
}