01Java并发编程的艺术之并发编程的挑战
一、上下文切换
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并发编程的艺术之并发编程的挑战相关推荐
- java并发编程的艺术和并发编程这一篇就够了
java并发编程的艺术(精华提炼) 通常我们在使用编发编程时,主要目的是为了程序能够更快的处理,但是并不是说更多的线程就一定能够让程序变得足够快,有时候太多的线程反而消耗了更多的资源,反而让程序执行得 ...
- Java并发编程的艺术-Java并发编程基础
第4章 Java并发编程基础 Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将 ...
- Java并发编程的艺术(一)——并发编程需要注意的问题
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34173549/article/details/79612496 并发是为了提升程序的执行速度 ...
- 【并发编程的艺术】并发机制原理
java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化成汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令 更好的进行 ...
- Java并发编程的艺术_Conc
Java并发编程的艺术 1 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片 ...
- java 并发 mobi_Java并发编程的艺术pdf txt mobi下载及读书笔记
Java并发编程的艺术pdf txt mobi读书笔记 如何解决资源限制的问题:对于软件资源限制,可以考虑使用资源池将资源复用.比如使用连接池将数据库和Socket连接复用,或者在调用对方webser ...
- Java并发编程的艺术 记录(一)
模拟死锁 package com.gjjun.concurrent;/*** 模拟死锁,来源于<Java并发编程的艺术>* @Author gjjun* @Create 2018/8/12 ...
- Java并发编程的艺术,解读并发编程的优缺点
并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...
- 多线程知识梳理(2) - 并发编程的艺术笔记
layout: post title: <Java并发编程的艺术>笔记 categories: Java excerpt: The Art of Java Concurrency Prog ...
最新文章
- 智能车竞赛技术报告 | 智能车视觉 - 中原工学院 - 逐鹿 - 分母队
- 张孝祥Java培训视频及孙鑫java视频网址
- lightningJS之动画
- iOS设备唯一标识(可以用版)
- sudo vi ~/etc/profile 报错E212:Can't open file for writing
- java 模块设计模式_Java9模块化学习笔记二之模块设计模式
- python中argument函数_PythonStudy——函数的参数 Function argument
- STL之inner_product
- 两种简单高效的“反人脸识别”方法
- VMware中linux虚拟机无法全屏显示的解决方法(1080P分辨率调节)
- python安装pika模块rabbitmq
- 计算机科学导论填空题,计算机科学导论习题
- 微信小程序登录流程理解
- Java课程设计之你画我猜
- mysql 8.0 配置文件my.cnf中文注解
- Ghost XP打XP SP3后出现登录不了的问题
- 软件腐化的七个特征之复杂性、重复性、晦涩性(设计模式原则的反面) (《敏捷软件开发》读书总结第三篇)
- 使用idea构建父子类springboot项目教程,并教你启动子项目(构建项目集合)
- 【附源码】计算机毕业设计JAVA研究生推免系统
- 软件构架和设计InfoQ趋势报告-2020年4月
热门文章
- win10系统下jdk环境变量配置
- 职校计算机课堂评课标准,2019年中职计算机评课稿
- 虚拟主机、云主机和云服务器有什么不同?
- 从秋香,芳娜到不嫁国人的女大学生
- 小米公司不管老用户的手机了。小米1
- mysql查询数据库中所有字段的属性
- Outlook2007备份邮件规则、联系人以及账号及在Outlook 2007中删除自动记忆的收件人...
- java模拟实现操作系统进程调度中的多级反馈队列算法
- 网易2018校园招聘编程题真题集合1魔法币
- 雷神笔记本做java,详细爆料雷神911Air星战三代 15.6寸笔记本好不好用?怎么样呢?大神吐槽真心话...