调用父类方法时,如何与子类方法,在锁对象不是同一个实例下,能线程安全,请见下面三种情况。
case1:
如下代码,在调用父类的方法时,和子类的方法,发生线程安全问题。原因的锁对象的实例不是同一个。
using System;using System.Collections.Generic; using System.Linq;using System.Text; using System.Threading.Tasks;using System.Threading; namespace ForTest//check the lock object for thread safety{ class Program { static void Main(string[] args) { son myson = new son(); Parallel.For(0, 5, (int i) => { myson.methodA(); myson.methodC(); }); Console.ReadKey(); } } public class grandfather { //protected static object syncRoot = new object(); } public class father:grandfather { private static object syncRoot = new object(); protected int cont = 0; public virtual bool methodA() { lock (syncRoot) { cont++; Thread.Sleep(1000); Console.WriteLine("cout++ is " + cont); return true; } } public virtual bool methodB() { lock (syncRoot) { return true; } } } public class son:father { private static object syncRoot = new object(); public bool methodC() { lock (syncRoot) { cont += 2; Thread.Sleep(2000); Console.WriteLine("cont += 2 is " + cont); return true; } } } }
输出:
cout++ is 1 cout++ is 4 cont += 2 is 5 cout++ is 5 cout++ is 8 cont += 2 is 9 cout++ is 11 cont += 2 is 11 cont += 2 is 13 cont += 2 is 15
case2:
case1的解决方法是,在父类初始化锁对象,让子类继承。这样就线程安全了。如下。
using System;using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ForTest//check the lock object for thread safety{ class Program { static void Main(string[] args) { son myson = new son(); Parallel.For(0, 5, (int i) => { myson.methodA(); myson.methodC(); }); Console.ReadKey(); } } public class grandfather { protected static object syncRoot = new object(); } public class father:grandfather { protected int cont = 0; public virtual bool methodA() { lock (syncRoot) { cont++; Thread.Sleep(1000); Console.WriteLine("cout++ is " + cont); return true; } } public virtual bool methodB() { lock (syncRoot) { return true; } } } public class son:father { public bool methodC() { lock (syncRoot) { cont += 2; Thread.Sleep(2000); Console.WriteLine("cont += 2 is " + cont); return true; } } } }
输出:
cout++ is 1 cout++ is 2 cont += 2 is 4 cout++ is 5 cout++ is 6 cout++ is 7 cont += 2 is 9 cont += 2 is 11 cont += 2 is 13 cont += 2 is 15
case3:
当然有些特殊情况下,子类硬要重新实例化一个锁对象。如何避免上面第一种线程安全问题发生?需要:
子类加锁重写父类分方法(如果父类methodA是虚方法)
或者
new一下(如果父类methodA是实例方法)。
using System;using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ForTest//check the lock object for thread safety{ class Program { static void Main(string[] args) { son myson = new son(); Parallel.For(0, 5, (int i) => { myson.methodA(); myson.methodC(); }); Console.ReadKey(); } } public class grandfather { protected static object syncRoot = new object(); } public class father:grandfather { protected int cont = 0; public virtual bool methodA() { lock (syncRoot) { cont++; Thread.Sleep(1000); Console.WriteLine("cout++ is " + cont); return true; } } public virtual bool methodB() { lock (syncRoot) { return true; } } } public class son:father { private static object sync = new object(); public override bool methodA()//重写 { lock (sync) { return base.methodA(); } } public bool methodC() { lock (sync) { cont += 2; Thread.Sleep(2000); Console.WriteLine("cont += 2 is " + cont); return true; } } } }
或
public new bool methodA()\\new一下 { lock (sync) { return base.methodA(); } }
输出:
cout++ is 1 cout++ is 2 cont += 2 is 4 cout++ is 5 cout++ is 6 cout++ is 7 cont += 2 is 9 cont += 2 is 11 cont += 2 is 13 cont += 2 is 15
以上就是 从0自学C#13--子类和父类方法的锁对象问题的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Hubungan antara C# dan .NET tidak dapat dipisahkan, tetapi mereka bukan perkara yang sama. C# adalah bahasa pengaturcaraan, sementara .NET adalah platform pembangunan. C# digunakan untuk menulis kod, menyusun bahasa pertengahan .NET (IL), dan dilaksanakan oleh Runtime .NET (CLR).

C#.NET masih penting kerana ia menyediakan alat dan perpustakaan yang kuat yang menyokong pelbagai pembangunan aplikasi. 1) C# menggabungkan rangka kerja NET untuk menjadikan pembangunan cekap dan mudah. 2) Mekanisme keselamatan dan sampah jenis C#meningkatkan kelebihannya. 3) .NET menyediakan persekitaran berjalan lintas platform dan API yang kaya, meningkatkan fleksibiliti pembangunan.

C#.netisversatileforbothwebanddesktopdevelopment.1) Forweb, useasp.netfordynamicapplications.2) Fordesktop, ExployWindowsFormsor Wpfforrichinterfaces.3) UseXamarinforcross-platformdevelopment, enablingcodesharingacrosswindows, macOS, linux, andmobiledevices.

C# dan .NET menyesuaikan diri dengan keperluan teknologi baru melalui kemas kini dan pengoptimuman berterusan. 1) C# 9.0 dan .NET5 Memperkenalkan jenis rekod dan pengoptimuman prestasi. 2) .Netcore meningkatkan sokongan asli dan kontena awan. 3) ASP.Netcore mengintegrasikan dengan teknologi web moden. 4) ML.NET menyokong pembelajaran mesin dan kecerdasan buatan. 5) Pengaturcaraan Asynchronous dan Amalan Terbaik meningkatkan prestasi.

C#.netissusuitibleforenterprise-levelapplicationswithinthememicrosoftecosystemduetoitsstrongtyping, richlibraries, androbustperformance.

Proses pengaturcaraan C# dalam .NET termasuk langkah -langkah berikut: 1) Menulis C# Code, 2) Menyusun bahasa pertengahan (IL), dan 3) yang dilaksanakan oleh Runtime .NET (CLR). Kelebihan C# dalam .NET adalah sintaks moden, sistem jenis yang kuat dan integrasi yang ketat dengan Rangka Kerja .NET, sesuai untuk pelbagai senario pembangunan dari aplikasi desktop ke perkhidmatan web.

C# adalah bahasa pengaturcaraan yang berorientasikan objek moden yang dibangunkan oleh Microsoft dan sebagai sebahagian daripada Rangka Kerja .NET. 1.C# menyokong pengaturcaraan berorientasikan objek (OOP), termasuk enkapsulasi, warisan dan polimorfisme. 2. Pengaturcaraan Asynchronous dalam C# dilaksanakan melalui Async dan menunggu kata kunci untuk meningkatkan respons aplikasi. 3. Gunakan LINQ untuk memproses koleksi data dengan ringkas. 4. Kesilapan umum termasuk pengecualian rujukan null dan pengecualian indeks luar. Kemahiran penyahpepijatan termasuk menggunakan debugger dan pengendalian pengecualian. 5. Pengoptimuman Prestasi termasuk menggunakan StringBuilder dan mengelakkan pembungkusan yang tidak perlu dan unboxing.

Strategi ujian untuk aplikasi C#. NET termasuk ujian unit, ujian integrasi, dan ujian akhir-ke-akhir. 1. Ujian unit memastikan bahawa unit minimum kod berfungsi secara bebas, menggunakan rangka kerja MSTest, Nunit atau Xunit. 2. Ujian Bersepadu Mengesahkan fungsi pelbagai unit yang digabungkan, data simulasi yang biasa digunakan dan perkhidmatan luaran. 3. Ujian akhir-ke-akhir mensimulasikan proses operasi lengkap pengguna, dan selenium biasanya digunakan untuk ujian automatik.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

Dreamweaver CS6
Alat pembangunan web visual