一、概念
1、所有的并发只有2种:互斥(某种锁) +同步(某种条件)
2、互斥:只允许一个线程访问,jvm在调度时间片时使用
3、同步:应用间的协调,是应用为了实现某种逻辑而写的,一般基于互斥实现
4、POSIX中定义的工具:内存barrier(避免多核cache导致的不一致)、mutex、condition、readwritelock、semaphore
5、管程 monitor,把pv操作、加解锁抽象成数据结构,而不是散列在线程的代码里
6、io缓存:cpu用DMA缓存到内核,之后拷贝到用户空间,比不用缓存好的地方:不用多次分配和释放内存;可以一次让磁盘读入整个块;在读入的时候,使用更少的cpu干预。
7、内存映射:内核和用户空间使用同一个缓存,省了拷贝过程
8、JAVA NIO 直接buffer:不需要走jvm的堆,使用OS的内存
二、一些常识
1、Waiting VS blocked
waiting:程序员写的等待逻辑,切换时间片
blocked:io操作,竞争厉害的synchronized,sleep 等,导致线程等候,是jvm实现的
2、yield:还是runnable,但是暂时让jvm调度别人
3、java使用多线程的好处:
1>充分利用多核cpu 2>多个操作并发进行,提高响应速度,避免消息被堵住 3> 多线程IO的好处是可以充分利用内存cache和DMA,IO里面的逻辑可以并行。
4、使用多线程的坏处:1>上下文切换有成本(几十个到几百个clock):CPU寄存器需要保存和加载,系统调度器的代码需要执行,多核cache之间的共享数据 2> 占内存。3> IO DMA无法并行的情况下,多线程会降低吞吐率。
5、linux的"时间片"默认是0.75ms到6ms
6、main中没有非daemon线程时,会退出jvm进程;
7、安全的终止:在while循环里检查状态,而不是调用stop
三、java提供的工具(cache cas mutex/condition)
1、volatile(无锁):使寄存器缓存行失效,强制别的线程重新读内存(适用于一个线程写,多个线程读)
2、synchronized 互斥的逻辑,某种类型的锁(类似于管程),对应于上面的互斥。jvm的实现非常高效,具体的实现如下:
1》默认偏向锁:单线程执行时连lock的调用都不需要,直接在object的头部记录一个状态即可,实现层面仅仅添加了一个monitorenter指令。适合于大多数情况下,synchronized修饰的代码块都是单线程执行的情况,也可以认为是对单线程情况的优化。
2》轻量级锁(可重入、不可中断、非公平):有别的线程来竞争时升级为轻量级锁,用自旋(cpu空转)来等待别的线程释放锁(不切换时间片),适合于很快就会获得锁的情况(等一会时,这个时间片还没有结束)(jvm内部全部是轻量级锁)
3》重量级锁:自旋的时间很久时,使用重量级锁,需要切换时间片,避免空转(线程变为blocked)
3、原子操作 atomixXXX cas自旋的方式实现(不加锁)
4、wait(释放锁)/notify 对应于同步
程序员控制的线程之间的交互同步,而不是jvm的时间片调度。条件一定要加锁使用。wait会释放相应的锁,但是notify不会,notify执行后不会马上回到wait,而是等待竞争到锁之后才执行到wait的逻辑,获得条件后还需要检查状态。notify使线程由等待条件变成等待锁。
WaitQueue->SynchronizedQueue中
synchronized(lock){while(!flag){lock.wait();} do();}
synchronized(lock){change();lock.notifyall();}
5、piped 用于线程间传递数据(基于共享内存)
6、Thread类(只有wait释放锁)
join 内部也是加锁(synchronized),循环判断,wait
sleep/yield 让出cpu时间片,不释放锁
7、锁的公平性(fair):释放后一定放到队尾部,获取时一定从前往后;不公平获取,看上一次是否获取过。
8、线程挂起的原因:io、没有抢到时间片、没有获得锁
四、工具的扩展
1、锁:某种意义上的串行化。syncronized固化了使用方式,使用简单,但是不灵活。除了基本的同步需要,锁需要考虑 可重入?公平?互斥还是读写?非阻塞?超时?线程获取锁时是否可中断(不是一直阻塞在那)?更细的粒度?(默认全部是乐观锁) 这些灵活性通过java5的concurrent.lock包来实现(自己处理加解锁和死锁)。lock接口的灵活性 try lockInterruptibly r/w timeout
2、Synchronized语义:可重入、非公平、互斥、阻塞(不可中断,sleep时还会阻塞别的线程,自己死了锁还被保持着)、不能超时
3、锁的粒度:volatile < atomicXXX < CAS < 各种lock < wait
4、lock的扩展
ReentrantLock:可重入(递归),可中断(可实现获取就独占)
ReentrantReadWriteLock:读多写少时,粒度小,性能高。
StampedLock:避免太多读线程,使得写线程很难调度到,有写时应该先允许写,之后重新读就好了,考虑的是公平性
AbstractQueuedSynchronizer:管理互斥共享阻塞队列、等候队列。tryacquire(Shared) getExclusiveQueuedThreads
isHeldExclusively release
阻塞的线程,是否响应中断?Interruptibly(不会移除同步队列)acquire 同步获取,得不到阻塞
5、wait/notify的扩展
LockSupport:等待和解除等待(没有wait/notify时序要求)
park: 等待条件,不需要在unpark之前,
unpark: 释放一个条件
condition:支持多个队列、超时和中断,synchronizer内部类
await(释放锁):怎么返回?被signal或被中断
signal:等待队列-->同步队列,只有再次获得锁才会执行wait后续的操作
总结:ReentrantReadWriteLock/StampedLock;condition/LockSupport
相关推荐
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
在深入讨论具体技术细节之前,我们先了解一些关键的Java并发概念: 1. **Java Memory Model (JMM)**: - **定义**: 在Java SE 5 (JSR133)中引入的Java Memory Model (JMM)旨在确保编写并发代码时的一致性和可预测性...
锁机制是Java并发编程中的另一大主题,包括内置锁(互斥锁)和显式锁(如`ReentrantLock`)。内置锁是`synchronized`关键字提供的,而显式锁提供了更细粒度的控制和更丰富的功能。书中可能还会讨论读写锁(`...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
总的来说,《JAVA并发编程实践》是一本深度和广度兼备的并发编程指南,无论是初学者还是有经验的Java开发者,都能从中受益匪浅。通过学习这本书,你将能够有效地应对并发编程中的挑战,提升你的多线程编程能力。
通过阅读《Java并发编程的艺术》这本书,开发者不仅可以掌握Java并发编程的基础知识,还能了解到一些高级特性和技巧,从而在实际开发中游刃有余。同时,附带的源码将有助于加深理解,提供实际操作的机会。
本书首先会介绍Java并发编程的基础概念,包括线程的创建与管理、同步机制如synchronized关键字和Lock接口,以及如何避免常见的并发问题,如死锁、活锁和饥饿。这些基础知识是理解并发编程的基石,通过深入浅出的讲解...
《Java并发程序设计教程》是一本深入探讨Java平台上的并发编程技术的专业书籍。并发和多线程是现代软件开发中的核心概念,特别是在Java这样的多线程支持强大的编程语言中。这本书详细介绍了如何在Java环境中有效地...
《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...
总的来说,这个资源包涵盖了Java并发编程的核心概念和技术,结合源码分析,学习者可以深入理解并发编程的原理,提升在实际项目中的应用能力。通过实践和调试源码,可以更好地掌握这些知识点,提高解决问题的能力。
《Java并发编程实战》是Java开发者深入理解和掌握并发编程的一本经典著作。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者在多核时代编写出高效、可伸缩且线程安全的代码。 并发编程是现代...
《JAVA并发编程实践》是Java开发者深入理解和应用并发编程的重要参考书籍,由Doug Lea等专家撰写,书中全面探讨了Java平台上的并发编程技术。在Java世界中,并发编程是提高程序性能和效率的关键手段,尤其在多核...
《Java并发实战编程》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握并发编程的核心概念和最佳实践。并发编程是现代软件开发中的关键领域,尤其是在多核处理器普及的今天,利用线程并行执行...
它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境中构建高效、可靠的系统。以下是本书涉及的一些关键知识点: 1. **Java并发基础**:介绍Java并发编程的基础知识,包括线程的创建与使用、...
#### 二、Java并发编程的底层实现原理 第二章深入探讨了Java并发编程的底层实现原理。这一章不仅涵盖了CPU层面的知识,还涉及到了JVM内部的工作机制。例如,作者们详细解释了Java虚拟机是如何管理和调度线程的,...
《Java并发编程实践》是一本由Brian Goetz等人编写的关于Java并发编程的经典著作。本书深入浅出地介绍了Java 5.0及之后版本中新增加的并发特性,并对并发编程进行了全面而详尽的讲解。自发布以来,这本书因其内容的...
总结起来,J.U.C库是Java并发编程中不可或缺的一部分,它以丰富的并发工具类、高效的执行效率和简洁的API设计,帮助开发者构建起强大的并发应用程序。通过理解J.U.C的工作原理和应用方法,开发者不仅能够编写出性能...
总的来说,《JAVA并发编程实践》这本书全面覆盖了Java并发编程的各个方面,无论是初学者还是有经验的开发者,都能从中获得宝贵的知识和实践经验。通过阅读这本书,你将能够更好地驾驭Java并发编程,编写出高效、稳定...