美文网首页
上下文切换与死锁

上下文切换与死锁

作者: 黑小鹰 | 来源:发表于2019-01-01 16:36 被阅读8次

多线程一定快吗?


答案是不一定。当并发执行的累积数量一定以内,并行会比串行执行要慢,此处用的测试用例是累加,那么为什么会出现这种情况呢?

这是因为线程的创建的上下文切换的开销

上下文切换

单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制,因为时间片非常短,所以CPU通过不停切换线程执行的,时间一般是即使毫秒(ms)


public class ConcurrencyTest {
    private  static final  long count = 100001;
    
    public static void main(String[] args) throws InterruptedException{
        concurrency();
        serial();
    }

    private static void concurrency() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread thread = new Thread(new Runnable() {
            @Override
            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--;
        }
        long time = System.currentTimeMillis()-start;
        thread.join();
        System.out.println("concurrency:"+time+"ms,"+" b="+b);
    }

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

这就像我们同时读两本书,当我们在读一本英文的技术书时,发现某个单词不认识,于是便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度

如何减少上下文切换呢?

无锁并发编程 使用一下办法来避免使用锁
CAS算法 Compare And Swap 即比较和替换
使用最小线程数

死锁列子

package com.hunau;

public class DeadLockDemo {
    
    private static String  A = "A";

    private static String  B = "B";
    
    public static void main(String[] args) {
        new DeadLockDemo().deadLock();
    }

    private void deadLock() {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized(A) {
                    try {
                        Thread.currentThread().sleep(2000);
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    synchronized(B) {
                        System.out.println("1");
                    }
                }
                
            }
            
        });
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized(B) {
                    synchronized(A) {
                        System.out.println("2");
                    }
                }
                
            }
            
        }) ;
        t1.start();
        t2.start();
    }
}

相关文章

  • 2:并发编程的挑战

    1:上下文切换 减少上下文切换的方法:无锁并发编程、CAS算法、使用最少线程和使用协程。 2:死锁 避免死锁的几种...

  • 并发编程01-对于并发的认知

    多线程和并发的概念 上下文切换 如何减少上下文切换无锁并发编程CAS算法使用最少线程协程 死锁避免死锁的几个常见的...

  • java并发编程的艺术笔记第一章——并发编程的挑战

    1、并发编程的挑战来自哪里? 1.1、上下文切换 1.2、死锁 1.3、资源限制的挑战 1.1、上下文切换 单核处...

  • 上下文切换与死锁

    多线程一定快吗? 答案是不一定。当并发执行的累积数量一定以内,并行会比串行执行要慢,此处用的测试用例是累加,那么为...

  • 多线程之GCD

    GCD术语 串行和并行 同步和异步 关键段 竞争条件 死锁 线程安全 线程上下文切换 平行与并发 平行:多个线程可...

  • 并发基本原理以及常用工具类介绍

    并发编程的挑战: 频繁的上下文切换 死锁(线程循环依赖对方释放锁) 资源限制的挑战 如何减少上下文切换: 无锁并发...

  • Java并发编程73道面试题快速一览

    1、在java中守护线程和本地线程区别? 2、线程与进程的区别? 3、什么是多线程中的上下文切换? 4、死锁与活锁...

  • 第一章 并发编程的挑战

    并发编程相对于单线程的挑战有 上下文切换 死锁 1.常用工具 使用Lmbench可以测试上下文切换时长使用vmst...

  • 1. 并发编程的挑战

    多线程面临的挑战:上下文切换的问题、死锁、受限于硬件和软件的资源限制问题; 上下文切换 单个CPU通过分配时间片实...

  • 并发编程的挑战

    目前存在的挑战 上下文切换问题线程死锁问题硬件和软件资源限制问题 上下文切换 单核处理器也支持多线程执行代码,CP...

网友评论

      本文标题:上下文切换与死锁

      本文链接:https://www.haomeiwen.com/subject/gnynlqtx.html