什么是线程同步?又如何解决线程同步问题?

简介: 解决多个线程同时操作一个资源的问题

线程同步问题就是解决多个线程同时操作一个资源的问题

    {
        private static int counter = 0;

        static void Main(string[] args)
        {
            Thread t1 = new Thread(() => {
                for (int i = 0; i < 1000; i++)
                {
                    counter++; Thread.Sleep(1);
                }
            });
            t1.Start();

            Thread t2 = new Thread(() => {
                      
                for (int i = 0; i < 1000; i++)
                {
                    counter++; Thread.Sleep(1);
                }
            }); t2.Start();

            while (t1.IsAlive) { };
            while (t2.IsAlive) { };
            Console.WriteLine(counter);
            Console.ReadKey();
        }
    }

上面分别开启了两个线程来同时运行,打印结果是多少?反正不会是2000,不信自己验证下,反正代码都放在这里了。

注意: while (t1.IsAlive) ;操作会大量消耗 cpu 空转,可以改成 t1.Join()就是让当前线程等待 t1 线程的结 束。

关于如何解决上面打印结果不是2000的问题(这就是两个线程同步都在运行,带来的结果误差)

一种方式我们首先应该想到的是加锁(lock),改用 lock 解决多个线程同时操作一个资源。lock 是 C#中的关键字,他要锁定一个资源,lock 的 特点是:同时只能有一个线程进入

lock 的对象的范围,其他 lock 的线程就要等。

    {
        private static int counter = 0;
        private static object locker = new object();
        static void Main(string[] args)
        {
            Thread t1 = new Thread(() => {
                for (int i = 0; i < 1000; i++)
                {
                    lock (locker)
                    { counter++; }
                    Thread.Sleep(1);
                }
            });
            t1.Start();

            Thread t2 = new Thread(() => {
                      
                for (int i = 0; i < 1000; i++)
                {
                    lock (locker)
                    { counter++; }
                    Thread.Sleep(1);
                }
            }); t2.Start();

            while (t1.IsAlive) { };
            while (t2.IsAlive) { };
            Console.WriteLine(counter);
            Console.ReadKey();
        }
    }

最后运行正确是2000,不信自己玩下。

相关文章
|
7月前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
172 0
|
2月前
|
安全 Java 开发者
在多线程编程中,确保数据一致性与防止竞态条件至关重要。Java提供了多种线程同步机制
【10月更文挑战第3天】在多线程编程中,确保数据一致性与防止竞态条件至关重要。Java提供了多种线程同步机制,如`synchronized`关键字、`Lock`接口及其实现类(如`ReentrantLock`),还有原子变量(如`AtomicInteger`)。这些工具可以帮助开发者避免数据不一致、死锁和活锁等问题。通过合理选择和使用这些机制,可以有效管理并发,确保程序稳定运行。例如,`synchronized`可确保同一时间只有一个线程访问共享资源;`Lock`提供更灵活的锁定方式;原子变量则利用硬件指令实现无锁操作。
30 2
|
4月前
|
Java
多线程线程同步
多线程的锁有几种方式
|
4月前
|
安全 Java
【多线程面试题 六】、 如何实现线程同步?
实现线程同步的方法包括同步方法、同步代码块、使用ReentrantLock、volatile关键字以及原子变量类,以确保线程安全和数据一致性。
|
7月前
|
安全 Linux 调度
【linux线程(二)】线程互斥与线程同步
【linux线程(二)】线程互斥与线程同步
|
7月前
|
存储 安全 Java
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
78 0
|
7月前
|
Linux 调度 C语言
【Linux C/C++ 线程同步 】Linux互斥锁和条件变量:互斥锁和条件变量在Linux线程同步中的编程实践
【Linux C/C++ 线程同步 】Linux互斥锁和条件变量:互斥锁和条件变量在Linux线程同步中的编程实践
201 0
|
7月前
|
Java 数据安全/隐私保护 块存储
多线程与并发编程【守护线程、线程同步】(三)-全面详解(学习总结---从入门到深化)
多线程与并发编程【守护线程、线程同步】(三)-全面详解(学习总结---从入门到深化)
123 1
|
7月前
|
Java 调度
详解线程同步和线程互斥,Java如何实现线程同步和互斥
详解线程同步和线程互斥,Java如何实现线程同步和互斥
41 0
|
7月前
|
Java
Java多线程:如何在Java中实现线程同步?
Java多线程:如何在Java中实现线程同步?
62 0