diff --git a/src/dawn/common/BUILD.gn b/src/dawn/common/BUILD.gn
index 189030f..66ca53a 100644
--- a/src/dawn/common/BUILD.gn
+++ b/src/dawn/common/BUILD.gn
@@ -246,7 +246,6 @@
       "Assert.h",
       "BitSetIterator.h",
       "Compiler.h",
-      "ConcurrentCache.h",
       "Constants.h",
       "ContentLessObjectCache.h",
       "ContentLessObjectCacheable.h",
diff --git a/src/dawn/common/CMakeLists.txt b/src/dawn/common/CMakeLists.txt
index ce3bb2b..32c4b95 100644
--- a/src/dawn/common/CMakeLists.txt
+++ b/src/dawn/common/CMakeLists.txt
@@ -53,7 +53,6 @@
     "Assert.h"
     "BitSetIterator.h"
     "Compiler.h"
-    "ConcurrentCache.h"
     "Constants.h"
     "ContentLessObjectCache.h"
     "ContentLessObjectCacheable.h"
diff --git a/src/dawn/common/ConcurrentCache.h b/src/dawn/common/ConcurrentCache.h
deleted file mode 100644
index c5e98be..0000000
--- a/src/dawn/common/ConcurrentCache.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2021 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef SRC_DAWN_COMMON_CONCURRENTCACHE_H_
-#define SRC_DAWN_COMMON_CONCURRENTCACHE_H_
-
-#include <mutex>
-#include <unordered_set>
-#include <utility>
-
-#include "dawn/common/NonMovable.h"
-
-namespace dawn {
-
-template <typename T>
-class ConcurrentCache : public NonMovable {
-  public:
-    ConcurrentCache() = default;
-
-    T* Find(T* object) {
-        std::lock_guard<std::mutex> lock(mMutex);
-        auto iter = mCache.find(object);
-        if (iter == mCache.end()) {
-            return nullptr;
-        }
-        return *iter;
-    }
-
-    std::pair<T*, bool> Insert(T* object) {
-        std::lock_guard<std::mutex> lock(mMutex);
-        auto [value, inserted] = mCache.insert(object);
-        return {*value, inserted};
-    }
-
-    size_t Erase(T* object) {
-        std::lock_guard<std::mutex> lock(mMutex);
-        return mCache.erase(object);
-    }
-
-  private:
-    std::mutex mMutex;
-    std::unordered_set<T*, typename T::HashFunc, typename T::EqualityFunc> mCache;
-};
-
-}  // namespace dawn
-
-#endif  // SRC_DAWN_COMMON_CONCURRENTCACHE_H_
diff --git a/src/dawn/tests/BUILD.gn b/src/dawn/tests/BUILD.gn
index 6158b5d..9af0d8b 100644
--- a/src/dawn/tests/BUILD.gn
+++ b/src/dawn/tests/BUILD.gn
@@ -325,7 +325,6 @@
     "unittests/BuddyMemoryAllocatorTests.cpp",
     "unittests/ChainUtilsTests.cpp",
     "unittests/CommandAllocatorTests.cpp",
-    "unittests/ConcurrentCacheTests.cpp",
     "unittests/ContentLessObjectCacheTests.cpp",
     "unittests/DefaultTests.cpp",
     "unittests/EnumClassBitmasksTests.cpp",
diff --git a/src/dawn/tests/unittests/ConcurrentCacheTests.cpp b/src/dawn/tests/unittests/ConcurrentCacheTests.cpp
deleted file mode 100644
index 3250061..0000000
--- a/src/dawn/tests/unittests/ConcurrentCacheTests.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2021 The Dawn & Tint Authors
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this
-//    list of conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice,
-//    this list of conditions and the following disclaimer in the documentation
-//    and/or other materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its
-//    contributors may be used to endorse or promote products derived from
-//    this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <memory>
-#include <utility>
-
-#include "dawn/common/ConcurrentCache.h"
-#include "dawn/native/AsyncTask.h"
-#include "dawn/platform/DawnPlatform.h"
-#include "dawn/utils/SystemUtils.h"
-#include "gtest/gtest.h"
-
-namespace dawn {
-namespace {
-
-class SimpleCachedObject {
-  public:
-    explicit SimpleCachedObject(size_t value) : mValue(value) {}
-
-    size_t GetValue() const { return mValue; }
-
-    struct EqualityFunc {
-        bool operator()(const SimpleCachedObject* a, const SimpleCachedObject* b) const {
-            return a->mValue == b->mValue;
-        }
-    };
-
-    struct HashFunc {
-        size_t operator()(const SimpleCachedObject* obj) const { return obj->mValue; }
-    };
-
-  private:
-    size_t mValue;
-};
-
-class ConcurrentCacheTest : public testing::Test {
-  public:
-    ConcurrentCacheTest() : mPool(mPlatform.CreateWorkerTaskPool()), mTaskManager(mPool.get()) {}
-
-  protected:
-    platform::Platform mPlatform;
-    std::unique_ptr<platform::WorkerTaskPool> mPool;
-    native::AsyncTaskManager mTaskManager;
-    ConcurrentCache<SimpleCachedObject> mCache;
-};
-
-// Test inserting two objects that are equal to each other into the concurrent cache works as
-// expected.
-TEST_F(ConcurrentCacheTest, InsertAtSameTime) {
-    SimpleCachedObject cachedObject(1);
-    SimpleCachedObject anotherCachedObject(1);
-
-    std::pair<SimpleCachedObject*, bool> insertOutput = {};
-    std::pair<SimpleCachedObject*, bool> anotherInsertOutput = {};
-
-    ConcurrentCache<SimpleCachedObject>* cachePtr = &mCache;
-    native::AsyncTask asyncTask1([&insertOutput, cachePtr, &cachedObject] {
-        insertOutput = cachePtr->Insert(&cachedObject);
-    });
-    native::AsyncTask asyncTask2([&anotherInsertOutput, cachePtr, &anotherCachedObject] {
-        anotherInsertOutput = cachePtr->Insert(&anotherCachedObject);
-    });
-    mTaskManager.PostTask(std::move(asyncTask1));
-    mTaskManager.PostTask(std::move(asyncTask2));
-
-    mTaskManager.WaitAllPendingTasks();
-
-    ASSERT_TRUE(insertOutput.first == &cachedObject || insertOutput.first == &anotherCachedObject);
-    ASSERT_EQ(insertOutput.first, anotherInsertOutput.first);
-    ASSERT_EQ(insertOutput.second, !anotherInsertOutput.second);
-}
-
-// Testing erasing an object after inserting into the cache works as expected.
-TEST_F(ConcurrentCacheTest, EraseAfterInsertion) {
-    SimpleCachedObject cachedObject(1);
-
-    std::pair<SimpleCachedObject*, bool> insertOutput = {};
-    ConcurrentCache<SimpleCachedObject>* cachePtr = &mCache;
-    native::AsyncTask insertTask([&insertOutput, cachePtr, &cachedObject] {
-        insertOutput = cachePtr->Insert(&cachedObject);
-    });
-
-    size_t erasedObjectCount = 0;
-    native::AsyncTask eraseTask([&erasedObjectCount, cachePtr, &cachedObject] {
-        while (cachePtr->Find(&cachedObject) == nullptr) {
-            utils::USleep(100);
-        }
-        erasedObjectCount = cachePtr->Erase(&cachedObject);
-    });
-
-    mTaskManager.PostTask(std::move(insertTask));
-    mTaskManager.PostTask(std::move(eraseTask));
-
-    mTaskManager.WaitAllPendingTasks();
-
-    ASSERT_EQ(&cachedObject, insertOutput.first);
-    ASSERT_TRUE(insertOutput.second);
-    ASSERT_EQ(1u, erasedObjectCount);
-}
-
-}  // anonymous namespace
-}  // namespace dawn
