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

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

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

    {
        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,不信自己玩下。

相关文章
|
3月前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
117 0
|
9月前
多线程学习之解决线程同步的实现方法
多线程学习之解决线程同步的实现方法
31 0
|
10月前
|
缓存 安全 Java
【JavaSE专栏78】线程同步,控制多个线程之间的访问顺序和共享资源的安全性
【JavaSE专栏78】线程同步,控制多个线程之间的访问顺序和共享资源的安全性
|
1天前
|
Java
多线程线程同步
多线程的锁有几种方式
|
3月前
|
安全 Linux 调度
【linux线程(二)】线程互斥与线程同步
【linux线程(二)】线程互斥与线程同步
|
3月前
|
存储 安全 Java
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
38 0
|
3月前
|
Linux 调度 C语言
【Linux C/C++ 线程同步 】Linux互斥锁和条件变量:互斥锁和条件变量在Linux线程同步中的编程实践
【Linux C/C++ 线程同步 】Linux互斥锁和条件变量:互斥锁和条件变量在Linux线程同步中的编程实践
99 0
|
3月前
|
Java 调度
详解线程同步和线程互斥,Java如何实现线程同步和互斥
详解线程同步和线程互斥,Java如何实现线程同步和互斥
32 0
|
3月前
|
Java 数据安全/隐私保护 块存储
多线程与并发编程【守护线程、线程同步】(三)-全面详解(学习总结---从入门到深化)
多线程与并发编程【守护线程、线程同步】(三)-全面详解(学习总结---从入门到深化)
92 1
|
3月前
|
Java
Java多线程:如何在Java中实现线程同步?
Java多线程:如何在Java中实现线程同步?
42 0