上下文切换

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

并发执行不一定比串行执行快,因为线程有创建和上下文切换的开销。

减少上下文切换的方法有:

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

CAS算法(compare-and-swap):Java的Atomic包使用CAS算法来更新数据,而不需要加锁

public class AtomicCounter{

private final AtomicInteger counter = new AtomicInteger(0);

public int getValue(){

return counter.get();

}

public void increment(){

while(true) {

int existingValue = getValue();

int newValue = existingValue + 1;

if(counter.compareAndSet(existingValue, newValue)) {

return;

}

}

}

}

复制代码

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

协程(Quasar):在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

死锁

锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。

避免死锁的几种常见方法:

避免一个线程同时获取多个锁

避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源

尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制

对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况

资源限制

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。 例如服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成10Mb/s,所以在进行并发编程时,要考虑这些资源的限制。

常见资源限制有:

带宽的上传/下载速度

硬盘读写速度

CPU的处理速度

数据库的连接数

socket连接数等

在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源仍然在串行执行,这时候程序不仅不会加快执行反而会更慢,因为增加了上下文切换和资源调度的时间。

查看java上下文切换,七日打卡--java并发编程之上下文切换相关推荐

  1. java实现七日股票问题_七日打卡--JAVA资源限制

    资源限制 资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源. 例如服务器的带宽只有2Mb/s,某个资源的下载速度是1Mb/s每秒,系统启动10个线程下载资源,下载速度不会变成 ...

  2. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. java的尝试性问题_Java并发编程实战 03互斥锁 解决原子性问题

    文章系列 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和有序性的问题,那么还有一个原子性问题咱们还没解决.在第一篇文章01并发编程的Bug源头当中,讲到了把一个或者多 ...

  4. java线程同步的实现_Java并发编程(三) - 实战:线程同步的实现

    synchronized关键字 首先,来看一个多线程竞争临界资源导致的同步不安全问题. package com.example.weishj.mytester.concurrency.sync; /* ...

  5. java多线程 门闩_Java线程与并发编程实践----同步器(倒计时门闩,同步屏障)...

    Java提供的synchronized关键字对临界区进行线程同步访问.由于基于synchronized很难 正确编写同步代码,并发工具类提供了高级的同步器.倒计时门闩(countdown latch) ...

  6. java内存屏障_内存屏障 | 并发编程网 – ifeve.com

    本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术. CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远 ...

  7. java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  8. Java架构技术文档:并发编程+设计模式+常用框架+JVM+精选视频

    本篇文章是我们整理的一份架构师的成长路线,包括了并发编程.设计模式.常用框架.中间件.微服务与分布式.常用工具.JVM.MySQL.数据结构与算法,还有架构师精选视频.架构师成长路线高清大图. 又是新 ...

  9. java对象头_我的并发编程(二):java对象头以及synchronized升级过程

    一.概述 研究java对象头的目的是详细分析Java的synchronized锁的升级过程,因为synchronized在锁升级的时候,就是依赖对象头的信息来决定的.本博文针对64位的操作系统来对Ja ...

最新文章

  1. 基于IndexedDB实现简单文件系统
  2. Winmail邮件服务器
  3. jQuery easyUI--tabs选项卡面板
  4. 怎样编译libdb_比特币编译(Ubuntu 16.04)
  5. [Leedcode][JAVA][第85题][第221题][最大正方形][动态规划]
  6. 网络访问此计算机,从网络访问此计算机 - 安全策略设置
  7. order by 子查询_SQL查询语法
  8. 80-20-075-原理-Flink内存管理
  9. linux 写地址 hex,你怎么理解Hex文件? (扩展地址记录)
  10. 蓝桥杯B组省赛预赛第一题2013(高斯日记)
  11. 西南大学C语言2019年12月,西南大学[1056]计算机基础2020年12月机考参考答案
  12. LR学习笔记十 之 场景分析
  13. ubuntu下格式化被写保护的U盘
  14. 操作系统 设备基本概念和分类
  15. 金蝶新建生产领料单,单据编号不能自动填写
  16. Java面试题合集(1)
  17. 英文简历技能证书撰写技巧汇总
  18. 基于SSM的汽车维修管理软件设计与实现
  19. 《棒球殿堂》:棒球联盟LEAGUE·埼玉西武狮
  20. java开发工程师每天工作几小时,详细说明

热门文章

  1. 亚马逊创始人贝佐斯离婚协议本周生效 前妻分得380亿美金
  2. 华为nova 5 Pro现身GeekBench数据库:妥妥麒麟980水准
  3. 首批5G成员!中兴天机Axon 10 Pro下周发布
  4. R40gpio输出无高低电平变化【原创】
  5. 晨哥真有料丨宁缺毋滥会等来一个很好的人吗?
  6. 程序bug导致了天大的损失,要枪毙程序猿吗?
  7. c4503文件服务器,理光C3503/C4503/C5503检查状态下各项目说明解释
  8. 记一次由PCI BAR配置不正确引发的硬盘IO调度io_schedule阻塞的经历
  9. 点阵字体显示系列补记2:关于24点阵汉字显示程序及其修改版本
  10. 大学生职业生涯规划计划与路径_我校举办2020年大学生职业生涯规划大赛