template<class T, class Lock = NoLock> class Array
{
	Lock lock;
public:
	void push_back(const T& v)
	{
		lock.Lock();
		// ...
		lock.Unlock();
	}
}

class MutexLock
{
public:
	inline void Lock() { cout << "Mutex Lock" << endl; }
	inline void Unlock() { cout << "Mutex Unlock" << endl; }
}
class NoLock
{
public:
	inline void Lock() {}
	inline void UnLock() {}
}