java怎么拦截某个对象
254
2022-09-16
C#线程同步
原子操作类:
public abstract class CounterBase { public abstract void Increase(); public abstract void Decrease(); }
public class CounterNoInterlocked : CounterBase { public int Count { get; private set; } public override void Decrease() { Count--; } public override void Increase() { Count++; } }
public class CounterWithInterlocked : CounterBase { private int _count; public int Count { get { return _count; } } public override void Decrease() { Interlocked.Decrement(ref _count); } public override void Increase() { Interlocked.Increment(ref _count); } }
Mutex类:
static void Main(string[] args) { // 应用场景:WinForm应用程序只能启动一个 string mutexName = "互斥量"; using (var mutex = new Mutex(false, mutexName)) { if (mutex.WaitOne(TimeSpan.FromSeconds(5), false)) { Console.WriteLine("运行中...."); Console.ReadLine(); mutex.ReleaseMutex(); } else { Console.WriteLine("第二个程序运行啦。。。。"); } } Console.WriteLine("Hello World!"); }
SemaphoreSlim:
static SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(10); ///
AutoResetEvent:
//false:无信号,子线程的WaitOne方法不会被自动调用; //true:有信号,子线程的WaitOne方法会被自动调用。 // 只有一个线程可以看到信号的改变 static AutoResetEvent _resetEvent = new AutoResetEvent(false); static int number = -1; public static void Start() { Thread t = new Thread(ReadThreadProc); t.Name = "Read"; t.Start(); for (int i = 0; i < 100; i++) { Console.WriteLine($"Wirte线程写入数字:{i}"); number = i; //发信号,通知正在等待的读线程写入操作已完成 _resetEvent.Set(); // 暂停1毫秒,给读线程时间读取数字 Thread.Sleep(1); } //t.Abort(); } static void ReadThreadProc() { while (true) { //读线程等待写线程写入数字 _resetEvent.WaitOne(); Console.WriteLine($"{Thread.CurrentThread.Name}线程读取到数字:{number}"); } }
class Sample2 { public static void Start() { RemoteRequest request = new RemoteRequest(); new Thread(request.RequestInterfaceA).Start(); new Thread(request.RequestInterfaceB).Start(); AutoResetEvent.WaitAll(request._resetEvents.ToArray()); request.RequestInterfaceC(); } } class RemoteRequest { public IList
ManualResetEventSlim:
static ManualResetEventSlim _event = new ManualResetEventSlim(false); static void Main(string[] args) { var t1 = new Thread(() => { ThroughGates(5); }); var t2 = new Thread(() => { ThroughGates(6); }); var t3 = new Thread(() => { ThroughGates(12); }); t1.Name = "t1"; t2.Name = "t2"; t3.Name = "t3"; t1.Start(); t2.Start(); t3.Start(); Console.WriteLine("主线程暂停6秒"); Thread.Sleep(TimeSpan.FromSeconds(6)); Console.WriteLine("主线程打开传送门..."); _event.Set(); Console.WriteLine("主线程暂停2秒"); Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine("主线程关闭传送门..."); _event.Reset(); Console.WriteLine("主线程暂停10秒"); Thread.Sleep(TimeSpan.FromSeconds(10)); Console.WriteLine("主线程第二次打开传送门..."); _event.Set(); Console.WriteLine("主线程暂停2秒"); Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine("主线程第二次关闭传送门..."); _event.Reset(); Console.ReadKey(); } static void ThroughGates(int seconds) { Console.WriteLine($"线程{Thread.CurrentThread.Name}进入传送门之前先暂停{seconds}秒。"); //for (int i = 1; i <= seconds; i++) //{ // Console.Write($"{i}..."); // Thread.Sleep(TimeSpan.FromSeconds(1)); //} Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine($"线程{Thread.CurrentThread.Name}暂停完毕,等待传送门的开启。"); _event.Wait(); Console.WriteLine($"线程{Thread.CurrentThread.Name}进入传送门!"); }
CountdownEvent:
static CountdownEvent _event = new CountdownEvent(3); static void Test(int seconds) { Console.WriteLine($"{Thread.CurrentThread.Name}线程开始执行..."); Thread.Sleep(TimeSpan.FromSeconds(seconds)); Console.WriteLine($"{Thread.CurrentThread.Name}线程执行完成!") ; _event.Signal(); } static void Main(string[] args) { Thread t1 = new Thread(() => { Test(2); }); t1.Name = "t1"; Thread t2 = new Thread(() => { Test(4); }); t2.Name = "t2"; Thread t3 = new Thread(() => { Test(6); }); t3.Name = "t3"; t1.Start(); t2.Start(); t3.Start(); _event.Wait(); Console.WriteLine("所有的线程执行完毕!"); _event.Dispose(); Console.ReadKey(); }
Barrier:
// 当您需要一组任务并行地运行一连串的阶段, // 但是每一个阶段都要等待所有其他任务都完成前一阶段之后才能开始, // 你可以通过Barrier实例来同步这一类协同工作 static Barrier _barrier = new Barrier(3, b => { Console.WriteLine($"=========当前是{b.CurrentPhaseNumber+1}阶段==============="); }); static void Test(string step1, string step2, string step3, int seconds) { string threadName = Thread.CurrentThread.Name; Console.WriteLine($"线程{threadName}开始执行第一阶段操作:{step1}"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); _barrier.SignalAndWait(); Console.WriteLine($"线程{threadName}开始执行第二阶段操作:{step2}"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); _barrier.SignalAndWait(); Console.WriteLine($"线程{threadName}开始执行第三阶段操作:{step3}"); Thread.Sleep(TimeSpan.FromSeconds(seconds)); _barrier.SignalAndWait(); Console.WriteLine($"线程{threadName}所有操作执行完毕"); } static void Main(string[] args) { Thread t1 = new Thread(() => { Test("步兵列阵", "步兵冲锋", "步兵退守", 3); }); t1.Name = "t1"; Thread t2 = new Thread(() => { Test("骑兵列阵", "骑兵冲锋", "骑兵退守", 4); }); t2.Name = "t2"; Thread t3 = new Thread(() => { Test("炮兵列阵", "炮兵装弹", "炮兵开炮", 5); }); t3.Name = "t3"; t1.Start(); t2.Start(); t3.Start(); Console.ReadKey(); }
ReaderWriterLockSlim
class Program { static void Main(string[] args) { new Thread(Read) { IsBackground = true }.Start(); new Thread(Read) { IsBackground = true }.Start(); new Thread(Read) { IsBackground = true }.Start(); new Thread(() => Write("线程 1")) { IsBackground = true }.Start(); new Thread(() => Write("线程 2")) { IsBackground = true }.Start(); Thread.Sleep(TimeSpan.FromSeconds(30)); Console.ReadKey(); } //读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。 //在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。 //某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。 //而如果采用读写锁,则多个线程可以同时读取该对象,只有等到对象被写入锁占用的时候,才会阻塞。 private static ReaderWriterLockSlim _rw = new ReaderWriterLockSlim(); private static Dictionary
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~