Pertama, gunakan mode tunggal dalam mode desain untuk mencegah beberapa inisialisasi objek, yang menyebabkan ketidakkonsistenan dalam ruang akses.
Kunci harus ditambahkan pada titik penghitungan untuk memblokir sementara penghitungan utas lainnya untuk memastikan keakuratan penghitungan.
Jika Anda ingin menghitung dan mengeluarkan secara real time, Anda dapat mengunci penghitungan dan keluaran secara bersamaan. Jika tidak, hasil penghitungan dan keluaran dari thread yang berbeda mungkin tidak diproses secara berurutan.
Mengunci dengan cara ini dapat memastikan pemrosesan berurutan dan keluaran berurutan, namun hal ini akan mengurangi sebagian kinerja.
Posisi kunci dalam kode sangatlah penting
Program ini akan menambahkan tiga operasi. Alasannya adalah thread ini belum mencapai 200 kali, tetapi harus ada thread yang ditambahkan untuk pertama kalinya, jadi buatlah penilaian di add.
Copy kode kodenya sebagai berikut:
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <ringkasan>
/// Utas berfungsi
/// </ringkasan>
kekosongan publik DoSomeWork()
{
///Membangun string tampilan
hasil string = "";
///Buat instance Sigleton
Sistem.Threading.Thread.Tidur(100);
ke dalam saya = 0;
sementara (MyCounter.GetCounter() < 200)
{
// Pastikan penghitungan konsisten dengan keluaran. Bahkan jika interval waktu ditambahkan antara penghitungan dan keluaran, area ini akan dikunci untuk mencegah thread lain beroperasi.
kunci (ini)
{
///Mulai menghitung
MyCounter.Tambahkan();
Sistem.Threading.Thread.Tidur(100);
Benang benang = Benang.Benang Saat Ini;
hasil += "utas";
hasil += i++.ToString() + "――〉" + thread.Nama + " ";
hasil += "Hitungan saat ini:";
hasil += MyCounter.GetCounter().ToString();
hasil += "/n";
Console.WriteLine(hasil);
// Hapus string tampilan
hasil = "";
}
}
}
kekosongan publik MulaiUtama()
{
Thread thread0 = Thread.Benang Saat Ini;
thread0.Name = "Utas 0";
Thread thread1 = Thread baru(ThreadStart baru(DoSomeWork));
thread1.Name = "Utas 1";
Thread thread2 = Thread baru(ThreadStart baru(DoSomeWork));
thread2.Nama = "Utas 2";
Thread thread3 = Thread baru (ThreadStart baru (DoSomeWork));
thread3.Nama = "Utas 3";
thread1.Mulai();
thread2.Mulai();
thread3.Mulai();
///Thread 0 hanya melakukan pekerjaan yang sama seperti thread lainnya
LakukanBeberapa Pekerjaan();
}
}