希望每晚带着收获入睡!而不是靠在床头玩晕了飞快入眠。。。


第一章:并发编程的挑战

1.1上下文切换
CPU通过给每个线程分配时间片实现分布机制。时间片一般是几十毫秒。
CPU通过时间片分配算法循环执行任务。切换时间片前,会保存上一个任务的状态。以便下次切回再加载。
好比带着不会的英文查字典。其实影响了读书效率。
1.1.1多线程一定快吗

循环次数不超过百万次时,并发比串行慢


1.1.3

减少上下文切换的方法:

1无锁并发编程,2CAS算法,3使用最少线程和使用协程。
1.将数据的ID用HASH分割,不同线程处理不同段的数据。
2.采用Atomic包里的CompareAndSet方法,不需要枷锁。

1.1.4 减少上下文切换实战
用jstack命令dump线程信息,看看pid为3117的进程里的线程都在

统计所有线程分别处于什么状态,发现300多个线程处于WAITING(onobjectmonitor)状态

打开dump文件查看处于WAITING(onobjectmonitor)的线程在做什么。发现这些线
程基本全是JBOSS的工作线程,在await。说明JBOSS线程池里线程接收到的任务太少,大量线
程都闲
着。
减少JBOSS的工作线程数,找到JBOSS的线程池配置信息,将maxThreads降到
100。
重启JBOSS,再dump线程信息,然后统计WAITING(onobjectmonitor)的线程,发现
减少了175个。WAITING的线程少了,系统上下文切换的次数就会少,因为每一次从
WAITTING到RUNNABLE都会进行一次上下文的切换。读者也可以使用vmstat命令测试一下。

1.2死锁
避免死锁的常见方法:

  1. 避免一个线程同时获取多个锁。
  2. 避免一个线程在锁内同时占用多个资源,保证每个锁只占用一个资源。
  3. 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
  4. 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败情况。

1.3资源限制的挑战
软件资源限制有数据库的连接和socket的连接数等。
即使有的代码改为并发执行,受限于资源,反而更慢。

对于硬件资源限制,可以考虑使用集群并行执行程序。比如使用ODPS、Hadoop或者自己搭建服务器集群。不同的机器处理不同的数据。
对于软件资源限制,可以考虑使用资源池将资源复用。比如使用连接池将数据库和Socket连接复用,或者调用对方webservice接口获取数据时,只建立一个连接。
根据不同的资源限制调整并发度。

《Java并发编程的艺术》:第1章 并发编程的挑战相关推荐

  1. 非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.6 抽象类

    非零基础自学Java (老师:韩顺平) ✈[[零基础 快速学Java]韩顺平 零基础30天学会Java] 第10章 面向对象编程(高级部分) 文章目录 非零基础自学Java (老师:韩顺平) 第10章 ...

  2. 《OpenACC并行编程实战》—— 第1章 并行编程概览 1.1 加速器产品

    本节书摘来自华章出版社<OpenACC并行编程实战>一 书中的第1章,第1.1节,作者何沧平,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第1章 并行编程概 ...

  3. 【Java并发编程的艺术】第二章读书笔记之原子操作

    前言 今天的笔记来了解一下原子操作以及Java中如何实现原子操作. 概念 原子(atomic)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意 ...

  4. 并发编程的艺术:第二章

    第二章:Java并发机制的底层实现原理 Java代码在编译之后会生成字节码文件,也就是.class文件.class文件经过类加载器的加载到JVM中,JVM解释字节码文件,最终转化为汇编指令在CPU上执 ...

  5. 【Java开发语言 03】第三章 面向对象编程(面向对象与面向过程+类和对象+类成员一:属性+类成员二:方法+对象的创建和使用+封装和隐藏+构造器+关键字this,package,import)

    面向对象编程 1 面向对象与面向过程 1.1 java类及类的成员 2 java语言的基本元素:类和对象 2.1 类的语法格式 2.2 创建Java自定义类 2.3 对象的创建及使用 3 类的成员之一 ...

  6. 《Python编程无师自通》第13章 面向对象编程的四大支柱

    第13章 面向对象编程的四大支柱 "优良设计创造价值的速度,快于其增加成本的速度." --托马斯·C.盖勒(Thomas C.Gale) 面向对象编程有四大概念:封装.抽象.多态和 ...

  7. python编程快速上手第三章_Python编程快速上手 往让繁琐工作自动化-6.6 习题(示例代码)...

    Python编程快速上手 往让繁琐工作自动化-6.6 习题 1.什么是转义字符? 答:转义字符表示字符串中的一些字符,这些字符用别的方式很难在代码中打印出来. 2.转义字符\n和\t代表什么? 答:\ ...

  8. python编程案例教程第四章_Python编程入门-第四章 流程控制 -学习笔记

    第四章 流程控制 一.布尔逻辑 *在Python中,用True和False表示真值.一般使用4个主要的逻辑运算符来组合形成布尔值:not\and\or\==. 如: False==False #Tru ...

  9. Linux编程基础:第4章Shell编程 课后习题

    <Linux编程基础>黑马程序员/编著 清华大学出版社 目录 一.填空题 二.判断题 三.单选题 四.简答题 1.分析以下脚本代码: 2.写出shell脚本中while循环与until循环 ...

  10. python快速编程入门课本第六章_python编程快速上手第六章实践项目参考code

    代码如下: 题目的意思是通过一个函数将列表的列表显示在组织良好的表格中,每列右对齐 tableData = [['apples', 'oranges', 'cherries', 'banana'], ...

最新文章

  1. 19行关键代码,带你轻松入门PaddlePaddle单机训练
  2. java学习笔记-4 JVM垃圾回收(GC)
  3. 公共界面_小区公共区域广告收益究竟归谁?
  4. java反多态的代码_Java多态性代码详解
  5. linux命令数据盘分多个区,pvmove命令 – 移动物理盘区
  6. [Redux/Mobx] redux的thunk作用是什么?
  7. pageResponse - 让H5适配移动设备全家(移动端适配)
  8. Windows下Github使用方法
  9. windows 和 linux服务器环境下j2sdk 的安装和环境设置
  10. was控制台的用户和密码怎样加密使用_交换机密码忘记了,怎么办,密码恢复一分钟了解下...
  11. Redis搭建及介绍
  12. 人口各省预测模型matlab_基于MATLAB的人口预测模型
  13. U盘启动 WinPE系统维护工具 任意安装GHO/WIM/ESD系统映像 无广告专业版
  14. UCOSIII---工程移植
  15. 阿里性能调优工具Arthas
  16. 互联网电影购票网站调查思考
  17. Ubuntu密码忘记了怎么办?
  18. 基于OpenCV的形状检测
  19. 打蚊子表情包_打蚊子表情包 - 打蚊子微信表情包 - 打蚊子QQ表情包 - 发表情 fabiaoqing.com...
  20. 三星 Galaxy S6 Edge+ 中文动手玩:真的只是照了放大灯而已?

热门文章

  1. python 函数调用列表_python – 根据列表中的字符串调用函数
  2. php gd support not found.,安装php71w-gd并获取错误GD库扩展不适用于此PHP安装
  3. jpa 人大金仓数据库方言_生态丨参展CITE2020 人大金仓全栈数据库管理系统强势来袭!...
  4. Java进制间的转换
  5. react-native 自定义 下拉刷新 / 上拉加载更多 组件
  6. react native 问题点
  7. javaweb——新手上路1
  8. dojochina ExtJS视频解压密码
  9. 如何检查计算机账号克隆
  10. C++-实现matlab的meshgird(OpenCV)