Koleksi thread-safe vs. koleksi non-threadsafe dapat dilihat dengan cara yang berbeda.
Pertimbangkan toko tanpa petugas, kecuali saat checkout. Anda memiliki banyak masalah jika orang tidak bertindak secara bertanggung jawab. Sebagai contoh, katakanlah seorang pelanggan mengambil kaleng dari piramida-saat petugas sedang membangun piramida, neraka akan pecah. Atau, bagaimana jika dua pelanggan meraih barang yang sama secara bersamaan, siapa yang menang? Apakah akan ada perkelahian? Ini adalah koleksi non-threadsafe. Ada banyak cara untuk menghindari masalah, tetapi mereka semua memerlukan semacam penguncian, atau lebih tepatnya akses eksplisit dalam beberapa cara.
Di sisi lain, pertimbangkan toko dengan pegawai di meja, dan Anda hanya bisa berbelanja melaluinya. Anda mendapatkan antrean, dan meminta item kepadanya, dia membawanya kembali kepada Anda, dan Anda keluar dari barisan. Jika Anda membutuhkan lebih dari satu item, Anda hanya dapat mengambil sebanyak mungkin item pada setiap perjalanan pulang pergi yang Anda ingat, tetapi Anda harus berhati-hati untuk menghindari memonopoli petugas, ini akan membuat pelanggan lain marah di belakang Anda.
Sekarang pertimbangkan ini. Di toko dengan satu petugas, bagaimana jika Anda sampai di garis depan, dan tanyakan kepada petugas "Apakah Anda punya kertas toilet", dan dia berkata "Ya", dan kemudian Anda pergi "Oke, saya Aku akan kembali kepadamu ketika aku tahu berapa yang kubutuhkan ", maka pada saat kau kembali di garis depan, toko tentu saja bisa terjual habis. Skenario ini tidak dicegah oleh koleksi threadsafe.
Kumpulan threadsafe menjamin bahwa struktur data internal valid setiap saat, bahkan jika diakses dari banyak utas.
Koleksi non-threadsafe tidak disertai dengan jaminan semacam itu. Misalnya, jika Anda menambahkan sesuatu ke pohon biner pada satu utas, sedangkan utas lainnya sibuk menyeimbangkan kembali pohon tersebut, tidak ada jaminan item akan ditambahkan, atau bahkan pohon itu masih valid setelahnya, mungkin korup di luar harapan.
Namun, kumpulan threadsafe tidak menjamin bahwa operasi berurutan pada utas semuanya bekerja pada "snapshot" yang sama dari struktur data internal, yang berarti bahwa jika Anda memiliki kode seperti ini:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
Anda mungkin mendapatkan NullReferenceException karena inbetween tree.Count
dan tree.First()
, utas lain telah membersihkan node yang tersisa di pohon, yang berarti First()
akan kembali null
.
Untuk skenario ini, Anda perlu melihat apakah koleksi tersebut memiliki cara yang aman untuk mendapatkan apa yang Anda inginkan, mungkin Anda perlu menulis ulang kode di atas, atau Anda mungkin perlu mengunci.