1.并发编程挑战-上下文切换

并行和串行执行

package com.qdb.thinkv.thread.base;

/**
 * 问题:多线程一定快吗?不一定,通过调整 count分别设置 比如1w 和 1亿 进行比较
 * 思考:如何减少上下文切换?
 */
public class ConcurrencyTest {
    public static final long count=1000000000L;
    public static void main(String[] args) throws InterruptedException {
        concurrency();
        seriai();
    }

    public static void concurrency() throws InterruptedException{
        long start=System.currentTimeMillis();
        Thread thread=new Thread(new Runnable(){
            public void run() {
                int a=0;
                for (long i = 0; i < count; i++) {
                    a+=5;
                }
            }
        });
        thread.start();
        int b=0;
        for (long i = 0; i < count; i++) {
            b--;
        }
        thread.join();
        long time=System.currentTimeMillis()-start;
        System.out.println("concurrency"+time+"ms,b="+b);
    }

    public static void seriai(){
        long start=System.currentTimeMillis();
        int a=0;
        for (long i = 0; i < count; i++) {
            a+=5;
        }
        long time=System.currentTimeMillis()-start;
        System.out.println("seriai"+time+"ms,a="+a);
        start=System.currentTimeMillis();
        int b=0;
        for (long i = 0; i < count; i++) {
            b--;
        }
        time=System.currentTimeMillis()-start;
        System.out.println("seriai"+time+"ms,b="+b+",a="+a);
    }
}

总结:线程有创建和上下文切换的开销。

减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。

1.无锁并发编程。

多线程竞争锁时,会引起上下文切换,多线程处理数据时,可以用一些办法来避免使用锁。如数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。

2.cas算法。

java 的atomic包使用cas算法来更新数据,不需要加锁。

3.使用最少的线程。

避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

4.协程

在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

原文地址:https://www.cnblogs.com/tianzhiyun/p/9128608.html

时间: 2024-10-17 06:14:53

1.并发编程挑战-上下文切换的相关文章

JAVA并发编程艺术 一(并发编程的挑战)

从今天起开始java并发编程艺术的学习,每一章学习完以后再这里记录下内容的重点,做个笔记,加深印象. 并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行.在进行并发是,如果希望通过多现场执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题,死锁的问题,以及受限于硬件和软件的资源限制问题,本章会介绍几种并发编程的挑战以及解决方案 1.上下问切换 即使是单核处理器也支持多线程执行代码,cpu通过给每个线程分配cpu时间片来实现这个机制.时间片是

那些年读过的书《Java并发编程的艺术》一、并发编程的挑战和并发机制的底层实现原理

一.并发编程的挑战 1.上下文切换 (1)上下文切换的问题 在处理器上提供了强大的并行性就使得程序的并发成为了可能.处理器通过给不同的线程分配不同的时间片以实现线程执行的自动调度和切换,实现了程序并行的假象. 在单线程中:线程保存串行的执行,线程间的上下文切换不会造成很大的性能开销. 而在多线程中:线程之间频繁的调度需要进行上下文切换以保存当前执行线程的上下文信息和加载将要执行线程的上下文信息,而上下文切换时需要底层处理器.操作系统.Java虚拟机提供支持的会消耗很多的性能开 销.如果频繁的进行

Java并发编程的挑战

并发编程的目的是为了让程序运行得更快,但是,并不是线程启动的越多,就能让程序最大限度地并发执行.并发编程时,会面临非常多的挑战,比如上下文切换的问题,死锁的问题,以及受限于各种硬件和软件的资源限制问题. CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间后会切换到下一个任务.但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载到这个任务的状态.从任务保存到再加载的过程就是一次上下文切换. vmstat 1#vmstat可以测试上下文切换的次数.输出结果里的CS(C

第一章 并发编程的挑战

挑战一:上下文切换 多线程一定比单线程快么? public class ConcurrencyTest { private static final long count = 10001; public static void main(String[] args) throws InterruptedException { concurrency(); serial(); } private static void concurrency() throws InterruptedExcepti

第1章 并发编程的挑战

并发编程的目的是为了让程序运行的更快,但是并不是启动更多的线程就能让程序最大限度的并发执行.会面临非常多的挑战,比如上下文切换的问题.死锁的问题,以及软件硬件资源的问题等. 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms).在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务

如何减少并发编程中的上下文切换

一.首先,看看有什么工具可以度量上下文切换带来的消耗. 使用Lmbench3(一个性能分析工具)可以测量上下文切换时长 使用vmstat可以测量上下文切换的次数. 例如:在lunix命令界面:vmstat  2 1 CS(Content Switch)表示上下文切换的次数,从上面的测试结果中我们可以看到,上下文每一秒切换307次. 二.如何减少上下文切换 减少上下文切换的方法有无锁并发编程.CAS算法.使用最少线程和使用协程. 1. 无锁并发并发编程.多线程竞争锁时,会引起上下文切换,所以多线程

OC中并发编程的相关API和面临的挑战

OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文章出炉,2013年7月份的主题是并发编程,今天挑选其中的第2篇文章(Concurrent Programming: APIs and Challenges)进行翻译,与大家分享一下主要内容.由于内容比较多,我将分两部分翻译(API和难点)完成,翻译中,如有错误,还请指正. 目录 1.介绍 2.OS

并发编程中,如何减少上下文切换

减少上下文切换的方法有无锁并发编程.CAS算法.使用最少线程和使用协程.1. 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据.2. CAS算法.Java的Atomic包使用CAS算法来更新数据,而不需要加锁.3. 使用最少线程.避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态.4. 协程:在单线程里实现多任务的调度,并在单线程里维持多

并发编程的目标与挑战

If I had only one hour to save the worlds,I would spend fifty-five minutes defining the problem,and only five minutes finding the solution. 如果我只有1小时拯救世界,我将花55分钟定义这个问题而只花分钟去寻找解决方案 --Albert Einstein 本文讲解的将是多线程的一些重要概念,为接下来自己以及读者更好的理解并发编程做个铺垫. 之后会讲解volat