并发编程的挑战(java并发编程的艺术)

Johar      2022-05-10     362

关键词:

1.上下文切换
CPU通过给每个线程分配CPU时间片来实现并发,切换过程中线程的信息从保存到再加载就是一个上下文切换。由于频繁的进行上下文切换,会消耗资源,所以并发不一定比串行快。

可以通过Lmbench3测量上下文切换的时长;可以通过vmstat测量上下文切换的次数。

减少上下文切换的方法:

(1)无锁并发编程,例如通过ThreadLocal,不变模式等;

(2)CAS算法;

(3)使用最小的线程;

(4)协程

2.死锁
有个叫 Coffman 的牛人早就总结过了,只有以下这四个条件都发生时才会出现死锁:

(1)互斥,共享资源 X 和 Y 只能被一个线程占用;

(2)占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;

(3)不可抢占,其他线程不能强行抢占线程 T1 占有的资源;

(4)循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。

避免死锁的方法:

(1)避免一个线程同时获取多个锁;

(2)避免一个线程在锁内同时占用多个资源,尽量一个锁一个资源;

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

(4)对于数据库锁,加锁和解锁必须在一个数据库连接里面,否则会出现解锁是吧;

(5)如果必须使用锁锁住多个资源,例如转账,需要一次锁住转账账户、收款账户,可以用一定规则顺序锁定资源,即根据账户ID从小到大的规则,依次锁定账户,则可避免死锁;另外可以写个单例类来实现锁资源的申请、释放,代码示例如下:

class Allocator {

private List als;

// 一次性申请所有资源

synchronized void apply(

Object from, Object to){

// 经典写法

while(als.contains(from) ||

    als.contains(to)){

  try{

    wait();

  }catch(Exception e){

  } 

}

als.add(from);

als.add(to); 

}

// 归还资源

synchronized void free(

Object from, Object to){

als.remove(from);

als.remove(to);

notifyAll();

}

}

《java并发编程的艺术》学习小结

java并发编程的艺术第一章并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上... 查看详情

《java并发编程的艺术》学习小结

java并发编程的艺术第一章并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上... 查看详情

深入理解java多线程-java并发编程的艺术

今天深度学习一下《Java并发编程的艺术》的第1章并发编程的挑战,深入理解Java多线程,看看多线程中的坑。注意,哈肯的程序员读书笔记并不是抄书,而是将书中精华内容和哈肯的开发经验相结合,给你系统地讲述我对相关知... 查看详情

java并发编程的艺术目录

第7章:JAVA中的13个原子操作类第8章:JAVA中的并发工具类第9章:JAVA中的线程池 查看详情

java并发编程的艺术记录

模拟死锁packagecom.gjjun.concurrent;/***模拟死锁,来源于《Java并发编程的艺术》*@Authorgjjun*@Create2018/8/12**/publicclassDeadLockDemo{privatestaticStringA="A";privatestaticStringB="B";publicstaticvoidmain(String[]args){D 查看详情

java并发并发编程的挑战

并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死... 查看详情

java并发编程的艺术,解读并发编程的优缺点(代码片段)

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

java并发编程的艺术,解读并发编程的优缺点(代码片段)

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

《java并发编程的艺术》epub下载在线阅读,求百度网盘云资源

《Java并发编程的艺术》(方腾飞)电子书网盘下载免费在线阅读资源链接:链接:https://pan.baidu.com/s/19JrldXCS7yGVJadthE2VNw提取码:1dub  书名:Java并发编程的艺术作者:方腾飞豆瓣评分:7.4出版社:机械工业出版社出版年份... 查看详情

java并发编程

Java并发编程(一)之前看《ThinkingInJava》时,并发讲解的挺多的,自己算是初步了解了并发。但是其讲解的不深入,自己感觉其讲解的不够好。后来自己想再学一学并发,买了《Java并发编程实战》,看了一下讲的好基础、好多的理... 查看详情

《java并发编程的艺术》读后笔记-part2(代码片段)

文章目录《Java并发编程的艺术》读后笔记-part2第二章Java并发机制的底层实现原理1.volatile的应用1.1volatile的定义与实现原理2.synchronized的实现原理和应用2.1Java对象头2.2锁的升级与对比3.原子操作的实现原理3.1处理器如何实现原子... 查看详情

《java多线程编程核心技术》和《java并发编程的艺术》两本书的异同

...编程核心技术》:这本书让你入个门,整体上了介绍一些并发编程的基本API、常见场景和一些坑,推荐先看这本书,比较简单,适合新手,但是原理不够深入和《java并发编程的艺术》这本书从底层和实现原理开始讲起,深入java... 查看详情

java并发编程的挑战

   并发编程的目的是为了让程序运行得更快,但是,并不是线程启动的越多,就能让程序最大限度地并发执行。并发编程时,会面临非常多的挑战,比如上下文切换的问题,死锁的问题,以及受限于各种硬件和软件的... 查看详情

java并发编程艺术系列-一并发编程问题与解决

一、并发编程问题与解决上下文切换死锁资源限制1.1上下文切换1.1.1问题CPU通过时间片分配算法来循环执行任务,当前任务一个时间片执行完后会切换到下一个任务,要保存上一个任务的状态,有一定的开销多线程不一定快-因为... 查看详情

java并发编程艺术系列-二java并发机制底层原理

二、Java并发机制底层原理volatilesynchronized原子操作2.1volatile原理与应用2.1.1特点轻量级的synchronized共享变量的“可见性”(定义):如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的不会引... 查看详情

[并发编程的艺术]02-java并发机制的底层实现原理

...节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.一、volatile的应用  在多处理器开发中保证共享变量的"可见性",可见性的意思是:当一个线程修改一个共享变量时,另外一个线程能够... 查看详情

java并发编程的艺术.pdf高清版免费下载

下载地址:网盘下载备用地址:网盘下载   查看详情

java并发编程的艺术

CAS有两个特点:  1、for循环  2、compareAndSet(可能别的线程先改变然后又重置,此时CAS是成功的,也就是CAS执行的过程中,可能多个线程对此变量做了修改,而不是各个线程互斥的修改)  3、CAS和互斥锁不... 查看详情