多线程访问共享资源会导致线程间代码占用

在编写把一个30万条数据批量轮询调用拆分为多个线程(每个线程运行一部分数据)轮询调用时,发现多个线程和单次执行的时间没有太大差别

此时用系统自带的性能监视器发现,拆分成多个线程后占用的cpu和拆分前差不多,为此排查代码中的各模块处理逻辑发现了此类问题

尽量减少线程间同时使用到的公共变量,当把所有公共变量都变为线程内变量时发现多线程的运算优势明显体现处理

试例代码:

public class MutiThread
    {
        public void
TestSerial()
        {
           
//Console.WriteLine(AppDomain.GetCurrentThreadId());
            Stopwatch sw
= new Stopwatch();
            sw.Start();
           
TestRun(100000);
            sw.Stop();
           
Console.WriteLine("单条:" + sw.ElapsedMilliseconds);
        }

//private int Cur = 0;
        public void TestRun(object
objState)
        {
            int Count = (int)objState;

for (int i = 0; i < Count; i++)
           
{
                int Cur = 0;
                for (int j = 0; j <
10000; j++)
                {
                    Cur +=
j;
                }
                //Thread.Sleep(1);
           
}
        }

public void ThreadTestRun(object objState)
       
{
            MutiState state = objState as MutiState;
           
//Console.WriteLine(AppDomain.GetCurrentThreadId());
           
TestRun(state.intCount);
            state.resetEvent.Set();

}

public void TestParallel()
        {
           
//Console.WriteLine(AppDomain.GetCurrentThreadId());
            Stopwatch
sw = new Stopwatch();
            sw.Start();
           
List<MutiState> listState = new List<MutiState>();
           
for (int i = 0; i < 10; i++)
            {
                MutiState
state = new MutiState(10000);
                Thread th = new Thread(new
ParameterizedThreadStart(ThreadTestRun));
               
th.Start(state);
                listState.Add(state);
           
}
            WaitHandle.WaitAll(listState.Select(p =>
p.resetEvent).ToArray());
            sw.Stop();
           
Console.WriteLine("多线程:" + sw.ElapsedMilliseconds);
        }

}

public class MutiState
    {
        public int intCount { get;
set; }

public AutoResetEvent resetEvent { get; set; }

public MutiState(int intCur)
        {
            intCount =
intCur;
            resetEvent = new AutoResetEvent(false);
       
}
    }

时间: 2024-10-18 05:36:52

多线程访问共享资源会导致线程间代码占用的相关文章

Java基础教程:多线程基础(2)——线程间的通信

Java基础教程:多线程基础(2)--线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 思维导图 等待中 等待/通知机制 不使用等待/通知机制 我们可以使用使用sleep()与 whle(true) 死循环来实现多个线程间的通信. 虽然两个线程实现了通信,但是线程B必须不断的通过while语句轮训机制来检测某一个条件,这样会浪费CPU资源. 如果轮询间隔较小,更浪费时间间隔.如果轮训

多线程程序 怎样查看每个线程的cpu占用

可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序.这样就可以找到占用处理器的线程了. 直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号,然后跳转到3.查看哪个进程线程

java多线程系列5-死锁与线程间通信

这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两把锁对象 public static final Object objA = new Object(); public static final Object objB = new Object(); } public class DieLock extends Thread { private b

Java多线程并发09——如何实现线程间与线程内数据共享

本文将为各位带来 Java 阻塞队列相关只是.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程间数据共享 Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性.Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情况下我们希望做到"同步"和"互斥".有以下常规实现方法: 将数据抽象成一个类 将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以和

多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

"线程同步"的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行"线程同步(thread synchronization)". 线程同步的道理虽然简单,但却是给多线程开发带来复杂性的根源之一.当线程同步不好时,有可能会出现一种特殊的情形--死锁(Dead Lock). "死锁"的含义 死锁表示系统进入了一个僵化状态,所有线程都没有执行完毕,但却谁也没法继续

线程间通信和线程互斥

线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后在主线程刷新UI界面 视图布局我就不写了,大家自己来吧,线程间通信代码如下: #pragma mark - 添加响应方法触发创建子线程并加载数据 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

Java多线程之线程的状态以及线程间协作通信导致的状态变换

一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新建状态,即new Thread(...),还没有调用start方法时,线程处于新建状态. Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源.处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来

java多线程同步以及线程间通信详解&amp;消费者生产者模式&amp;死锁&amp;Thread.join()(多线程编程之二)

本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: [java] view plain copy print? package com.zejian.test; /** * @author zejian * @time 2016年3月12日 下午2:55:42 * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private 

Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性.因此,为避免线程安全问题,应该避免多线程环境下对此共享资源的并发访问. 线程安全问题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的:当多个线程都执行写操作时,需要考虑线程同步来解决线程安全问题. 二.线程同步(synchr