スレッドセーフなコンテナってどうやって実装するべきなんでしょうか?

struct A{
 A(const A& a) { lock(); assign(a); unlock(); }
 ~A() { lock(); release(); unlock(); }
};

たとえば上のようにした場合、タイミングによっては破棄されたコンテナを
コピーしようとしてしまう事がありますよね?

コンテナが保持するオブジェクトへのアクセスのみロックで保護して、
コンテナ自体へのアクセスのロックは利用側が気をつけるしかないんでしょうか?