线程同步的小例子(两个线程对一个List进行写操作)

本文探讨了一个线程同步的例子,涉及到两个线程同时对一个List进行写操作的问题。虽然尝试使用了并发控制,如System.Runtime.Remoting.Contexts的[Synchronization]特性,但在实际应用中并未观察到预期的同步效果,目前仍在查找问题根源。
摘要由CSDN通过智能技术生成

这个只是一个并发操作,还未实现真正的同步,如同在经过同一个地点时,一个是从高架上走的,一个是从路面走的

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;



namespace ThreadSynchronization
{

    class Program
    {
        static Thread t1 = new Thread(write1);
        static Thread t2 = new Thread(write2);

        static List<int> list = new List<int>();
        private static void write1()
        {
            Monitor.Enter(list);                             //使用Monitor时,最后要手动释放list
            try
            {
                //lock (list)                                         //lock在执行完后会自动释放掉
                //{
                for (int i = 0; i < 10; i++)
                {
              
两个线程同时遍历100以内的数字时,这通常涉及到并发编程中的共享资源访问。在一个简单的例子中,可能会有一个数组或者集合包含从1到100的元素,两个线程各自从数组的一端开始遍历。 以下是可能出现的情况: 1. **无锁遍历**:如果数据结构允许,可以使用无锁数据结构如`ConcurrentSkipListSet`或者原子操作(如Java的`AtomicInteger`),使得每个线程独立地读取和修改数组元素,避免同步带来的开销。 ```java ExecutorService executor = Executors.newFixedThreadPool(2); IntStream numbers = IntStream.rangeClosed(1, 100); // 使用Future保证线程安全并获取结果 List<Future<Integer>> futures = new ArrayList<>(); for (int i : numbers) { futures.add(executor.submit(() -> i)); } // 同步获取所有结果 List<Integer> results = futures.stream().map(Future::get).collect(Collectors.toList()); executor.shutdown(); ``` 2. **锁保护**:如果数组或其他结构不允许无锁访问,就需要使用synchronized关键字或者Lock接口来保护关键部分的代码,防止竞态条件。但是这会引入性能损耗,因为每次只有一个线程能持有锁。 ```java int[] array = new int[100]; Semaphore semaphore = new Semaphore(1); // 一个信号量用于控制线程进入临界区 new Thread(() -> { for (int i = 0; i < 50; i++) { semaphore.acquire(); // 获取信号 processNumber(array[i]); semaphore.release(); // 释放信号 } }).start(); new Thread(() -> { for (int i = 50; i < 100; i++) { semaphore.acquire(); // 获取信号 processNumber(array[i]); semaphore.release(); // 释放信号 } }).start(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值