一、上下文切换

1、并发编程真的快吗?什么是上下文切换?

答案是不一定,根据测试结果,当数据小于百万的时候并发并没有串行快,这是为什么那?单核处理器的多线程并发,其实就是CPU个每个线程分配时间片,当时间片执行完就需要切换另一个线程的时间片来执行,时间片是非常小的单位,所以我们会觉得是并发!而他们发生切换的时候需要保存当前状态,然后在切换,而保存在切换之后的重新加载就是上下文切换,这也是比较浪费时间的!

public class Demo01 {/*** count = 10000001:*  concurrency:31ms,b:-50000005*  serial:39ms,b:-50000005,a:50000005** count = 1000001;*  concurrency:17ms,b:-500005*  serial:12ms,b:-500005,a:500005*      * count = 100001;*  concurrency:11ms,b:-500005*  serial:8ms,b:-500005,a:500005*/private static final long count = 1000001;public static void concurrency() throws InterruptedException {long startTime = System.currentTimeMillis();Thread thread = new Thread(new Runnable() {@Overridepublic void run() {int a = 0;for (int i = 0; i < count; i++){a += 5;}}});thread.start();int b = 0;for (int i = 0; i < count; i++){b -= 5;}thread.join();long time = System.currentTimeMillis() - startTime;System.out.println("concurrency:" + time + "ms,b:" + b);}public static void serial(){long startTime = System.currentTimeMillis();int a = 0;for (int i = 0; i < count; i++){a += 5;}int b = 0;for (int i = 0; i < count; i++){b -= 5;}long time = System.currentTimeMillis() - startTime;System.out.println("serial:" + time + "ms,b:" + b + ",a:" + a);}public static void main(String[] args) throws InterruptedException {concurrency();serial();}
}

2、如何减少上下文切换?

  • 使用无锁并发编程,没有锁的话就会减少线程之间的竞争,从而减少上下文切换!
  • 使用CAS算法,使用CAS更新值无需加锁!
  • 使用最少线程,尽量减少线程的时候从而避免上下文切换!
  • 协程,可以试试单线程维护多个任务的切换!

二、死锁

1、什么是死锁?

线程之间都拿着对方需要的资源,并且都不是释放资源,从而导致死锁!例如两个共享资源A和B,第一个线程先拿到A后锁住A,准备拿B,但是在第一个线程准备拿B的时候,第二个线程已经拿到B并且锁住,然后准备去拿资源A,这时候就发生了死锁了!这就是死锁!

public class Demo02 {private static String a = "a";private static String b = "b";public static void main(String[] args) {Thread thread_A = new Thread(new Runnable() {@Overridepublic void run() {synchronized (a){try {TimeUnit.SECONDS.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (b){System.out.println(Thread.currentThread().getName());}}}},"Thread_A");Thread thread_B = new Thread(new Runnable() {@Overridepublic void run() {synchronized (b){synchronized (a){System.out.println(Thread.currentThread().getName());}}}}, "Thread_B");thread_A.start();thread_B.start();}}

2、如何避免死锁

  • 避免一个线程获取多个锁
  • 避免一个线程同时占用多个资源
  • 使用定时锁,例如lock.tryLock();
  • 使用数据库锁,加解锁都是在一个数据库连接当中!

感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤

01Java并发编程的艺术之并发编程的挑战相关推荐

  1. java并发编程的艺术和并发编程这一篇就够了

    java并发编程的艺术(精华提炼) 通常我们在使用编发编程时,主要目的是为了程序能够更快的处理,但是并不是说更多的线程就一定能够让程序变得足够快,有时候太多的线程反而消耗了更多的资源,反而让程序执行得 ...

  2. Java并发编程的艺术-Java并发编程基础

    第4章 Java并发编程基础 ​ Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将 ...

  3. Java并发编程的艺术(一)——并发编程需要注意的问题

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34173549/article/details/79612496 并发是为了提升程序的执行速度 ...

  4. 【并发编程的艺术】并发机制原理

    java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化成汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令 更好的进行 ...

  5. Java并发编程的艺术_Conc

    Java并发编程的艺术 1 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片 ...

  6. java 并发 mobi_Java并发编程的艺术pdf txt mobi下载及读书笔记

    Java并发编程的艺术pdf txt mobi读书笔记 如何解决资源限制的问题:对于软件资源限制,可以考虑使用资源池将资源复用.比如使用连接池将数据库和Socket连接复用,或者在调用对方webser ...

  7. Java并发编程的艺术 记录(一)

    模拟死锁 package com.gjjun.concurrent;/*** 模拟死锁,来源于<Java并发编程的艺术>* @Author gjjun* @Create 2018/8/12 ...

  8. Java并发编程的艺术,解读并发编程的优缺点

    并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...

  9. 多线程知识梳理(2) - 并发编程的艺术笔记

    layout: post title: <Java并发编程的艺术>笔记 categories: Java excerpt: The Art of Java Concurrency Prog ...

最新文章

  1. 智能车竞赛技术报告 | 智能车视觉 - 中原工学院 - 逐鹿 - 分母队
  2. 张孝祥Java培训视频及孙鑫java视频网址
  3. lightningJS之动画
  4. iOS设备唯一标识(可以用版)
  5. sudo vi ~/etc/profile 报错E212:Can't open file for writing
  6. java 模块设计模式_Java9模块化学习笔记二之模块设计模式
  7. python中argument函数_PythonStudy——函数的参数 Function argument
  8. STL之inner_product
  9. 两种简单高效的“反人脸识别”方法
  10. VMware中linux虚拟机无法全屏显示的解决方法(1080P分辨率调节)
  11. python安装pika模块rabbitmq
  12. 计算机科学导论填空题,计算机科学导论习题
  13. 微信小程序登录流程理解
  14. Java课程设计之你画我猜
  15. mysql 8.0 配置文件my.cnf中文注解
  16. Ghost XP打XP SP3后出现登录不了的问题
  17. 软件腐化的七个特征之复杂性、重复性、晦涩性(设计模式原则的反面) (《敏捷软件开发》读书总结第三篇)
  18. 使用idea构建父子类springboot项目教程,并教你启动子项目(构建项目集合)
  19. 【附源码】计算机毕业设计JAVA研究生推免系统
  20. 软件构架和设计InfoQ趋势报告-2020年4月

热门文章

  1. win10系统下jdk环境变量配置
  2. 职校计算机课堂评课标准,2019年中职计算机评课稿
  3. 虚拟主机、云主机和云服务器有什么不同?
  4. 从秋香,芳娜到不嫁国人的女大学生
  5. 小米公司不管老用户的手机了。小米1
  6. mysql查询数据库中所有字段的属性
  7. Outlook2007备份邮件规则、联系人以及账号及在Outlook 2007中删除自动记忆的收件人...
  8. java模拟实现操作系统进程调度中的多级反馈队列算法
  9. 网易2018校园招聘编程题真题集合1魔法币
  10. 雷神笔记本做java,详细爆料雷神911Air星战三代 15.6寸笔记本好不好用?怎么样呢?大神吐槽真心话...