【java并发编程艺术学习】(二)第一章 java并发编程的挑战
章节介绍
主要介绍并发编程时间中可能遇到的问题,以及如何解决。
主要问题
1、上下文切换问题
时间片是cpu分配给每个线程的时间,时间片非常短。
cpu通过时间片分配算法来循环执行任务,当前任务执行一个时间片之后会切换到下一个任务。但是在切换之前会保存上一个任务的状态,以便再切换到这个任务时候,能够加载这个任务的状态。所以任务从保存再到加载的过程就是一次上下文切换。类似于读英文书时,遇到不懂的单词,记下读到的行数,翻出词典查询,查询完成后再翻到需要阅读的地方进行读取似的。
举例说明 多线程程序不一定是最快的。
1.1 代码示例:
package com.zhengze.test;
public class Test1 {
private static final long count = 10L;
/**
* 并行
* @throws InterruptedException
*/
public static void concurrency() throws InterruptedException {
long start = System.currentTimeMillis();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
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();//TODO 这个方法是做什么的?
System.out.println("时间:"+time+"===========b:"+b);
}
/**
* 串行
*/
public 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("时间2:"+time +"------a:"+a+"=====b:"+b);
}
/**
* 测试示例
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
concurrency();
serial();
}
}
代码示例,得出结论:多线程并不一定就比串行程序块!此处测试,数据量达到百万级别时候,多线程的速度会更好些。
具体,参照《java并发编程的艺术》中对应第一章节详细阅读。
1.2 减少上下文切换的方法
无锁并发编程、CAS算法、使用最少线程(比如任务很少,要避免创建不必要的线程来处理)、使用协程等。
(备注:这里需要补充下 协程 的知识点。。。。)
2、死锁
避免死锁的常见方法:
1、避免一个线程同时获取多个锁;
2、避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源;
3、尝试使用定时锁,使用 lock.tryLock(timeout)来替代使用内部锁机制;
4、对于数据库锁,加锁和解锁必须在用一个数据库连接里,否则会出现解锁失败的情况。
3、资源(软硬件等)限制的挑战
主要分为硬件资源限制和 软件资源限制:
硬件资源限制:主要为宽带的上传/下载速度、磁盘的读写速度、cpu的处理速度等;
软件资源限制:主要为数据库的连接数、socket的连接数等。
小节
笔者强烈推荐使用JDK并发包中提供的并发容器和工具类来解决并发问题。
(正在系统的学习下这部分的。)
【java并发编程艺术学习】(二)第一章 java并发编程的挑战的更多相关文章
- JavaScript DOM编程艺术学习笔记-第一章JavaScript简史
一,JavaScript的起源 JavaScript是Netscape与Sun公司合作开发,它是一种脚本语言,通常只能通过Web浏览器去完成一些操作.JavaScript为程序员提供了一些操控Web浏 ...
- Java 学习笔记 ------第一章 Java平台概论
本章学习目标: Java版本迁移简介 认识Java SE.Java EE.Java ME 认识JDK规范与操作 了解JVM.JRE与JDK 下载与安装JDK 一.Java版本迁移简介 书上已经表达得非 ...
- JavaScript DOM编程艺术学习笔记-第二章JavaScript语法
一.JavaScript示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- Windows Forms编程实战学习:第一章 初识Windows Forms
初识Windows Forms 1,用C#编程 using System.Windows.Forms; [assembly: System.Reflection.AssemblyVersion(& ...
- Java基础知识二次学习-- 第一章 java基础
基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...
- Java程序设计(2021春)——第一章课后题(选择题+编程题)答案与详解
Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 第一章选择题 1.1 Java与面向对象程 ...
- Java学习笔记 第一章 入门<转>
第一章 JAVA入门 一.基础常识 1.软件开发 什么是软件? 软件:一系列按照特定顺序组织的计算机数据和指令的集合 系统软件:DOS,Windows,Linux 应用软件:扫雷.QQ.迅雷 什么是开 ...
- 程序员编程艺术:第三章续、Top K算法问题的实现
程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha. 致谢:微软100题实现组,狂想曲创作组. 时间:2011年05月08日 ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
- javaSE习题 第一章 JAVA语言概述
转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...
随机推荐
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
- python微信库 --- itchat
python实现微信接口——itchat模块 安装 pip install itchat 登录 itchat.auto_login() # 这种方法将会通过微信扫描二维码登录,但是这种登录的方式确实短 ...
- 每天一个Linux命令(4)touch命令
touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来:二是用来创建新的空文件. (1)用法 用法:touch [选项]... ...
- P2455 [SDOI2006]线性方程组
P2455 [SDOI2006]线性方程组 真\(\cdot\)高斯消元模板题 由于各种hack数据被造出来~码量突增~,其实也就多了二三十行 将每行系数消到最多有一个非0数 特殊情况: 在过程同时 ...
- css3条纹边框效果
在线演示 本地下载
- Hadoop集群初始化启动
hadoop集群初始化启动 启动zookeeper ./zkServer.sh start 启动journalnode ./hadoop-daemon.sh start journalnode 格式化 ...
- Java 动态代理机制分析及扩展,第 1 部分
Java 动态代理机制分析及扩展,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/ 本文通过分析 Java 动态代理的机制和特 ...
- Mybatis异常_04_mapper.xml中不能使用小于号<、大于号>
一.解决方法: 1.< 2.<![CDATA[ < ]]> 将小于号替换为上述代码即可. 二.参考资料 1.mybatis配置中sql莫名其妙报错,多半是条件中小于符号捣的鬼
- RouterOS(ROS)简单限速/单IP限速脚
暂无评论 有时企业环境,或个人使用环境需要针对不同IP设置较多条不同限速,可以使用以下脚本批量处理后,再针对性的修改. *脚本说明:“2 to 254”定义要设置受限IP的起始,后面“192.168. ...
- Statement
题目大意 给定一棵基环外向树,和若干组询问,对于每次独立的询问都指定一些起点和一些终点,你删去一些边,使得从任意起点出发都无法到达终点,并让删去的边的编号的最小值最大,求这个最大的最小值. 题解 不难 ...