class SynchronizedItemStreamReader<T> implements ItemStreamReader<T>, InitializingBean {

	private ItemStreamReader<T> delegate;

	private final Lock lock = new ReentrantLock();

	public void setDelegate(ItemStreamReader<T> delegate) {
		this.delegate = delegate;
	}

	/**
	 * This delegates to the read method of the <code>delegate</code>
	 */
	@Override
	@Nullable
	public T read() throws Exception {
		this.lock.lock();
		try {
			return this.delegate.read();
		}
		finally {
			this.lock.unlock();
		}
	}

	@Override
	public void close() {
		this.delegate.close();
	}

	@Override
	public void open(ExecutionContext executionContext) {
		this.delegate.open(executionContext);
	}

	@Override
	public void update(ExecutionContext executionContext) {
		this.delegate.update(executionContext);
	}

	@Override
	public void afterPropertiesSet() throws Exception {<FILL_FUNCTION_BODY>}

}

		Assert.state(this.delegate != null, "A delegate item reader is required");
	
<no_super_class>