`
eric_weitm
  • 浏览: 235063 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java并发 一 概念和原理

    博客分类:
  • java
 
阅读更多

一、概念

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语言风格的Thread、synchronized、volatile,以及...

    java并发编程从入门到精通

    《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...

    Java高并发实战_java高并发_高并发_

    Java 并行程序开发的基础, 包括 Java 中 Thread 的基本使用方法等第3章介绍了 JDK 内部对并行程序开发的支持, 主要介绍 JUC (Java.util.concurrent) 中些工具的使用方法、 各自特点及它们的内部实现原理。...

    java并发编程与内存模型

    描述java并发编程原理 一.内存模型的相关概念 二.并发编程中的三个概念 三.Java内存模型 四..深入剖析volatile关键字 五.使用volatile关键字的场景

    Java 并发核心编程原文+译文

    java并发底层的一些概念、原理。 java5、java6中常用并发类、并发集合的属性和使用方法。

    Java-并发(Concurrent)编程

    多线程核心知识(概念、线程状态、线程安全问题、三大特性) 同步代码块Synchronized及其实现原理 volatile关键字及其实现原理 多线程在JVM中的实现原理 JUC概述 原子类Atomic-CAS及其实现原理 锁Lock-AQS核心原理...

    JAVA高质量并发详解,多线程并发深入讲解

    本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...

    完结13章一课掌握Java并发编程精髓

    Java并发编程从入门到进阶 多场景实战,众所周知,并发编程是优秀工程师的标准之一,但知识庞杂,复杂性高,常常让人望而却步。但如果没有掌握背后的核心原理,你开发的代码可能会成为难以调试和优化的头疼问题。在...

    java并发编程综合讲解

    这份资源为您提供了关于 Java 并发编程的全面讲解,着重介绍了 JUC(java.util.concurrent)库中的核心概念、工具和最佳实践。通过深入学习,您将能够更好地理解并发编程的挑战,掌握构建高性能、高可伸缩性的并发...

    java并发编程理论基础精讲

    本资源为您提供了关于 Java 并发编程理论基础的精讲,涵盖了多线程编程的核心概念、基本原理以及在 Java 中的应用。通过深入学习,您将建立坚实的并发编程基础,能够更好地理解和应对多线程编程中的挑战。 并发编程...

    java并发理论基础、可见性、原子性、有序性详解

    在Java并发理论基础方面,我们将会探讨并发编程的定义、多线程、共享变量和多线程间的互斥同步等理论概念。同时,我们也详细阐述了Java编程中的并发原理和机制。在可见性、原子性和有序性等方面,我们将深入讲解每个...

    Java并发编程最全面试题

    Java并发编程最全面试题,包括并发编程基础知识、并发理论...本文档适用于将要参加Java开发相关岗位面试、或者想要提高Java并发编程相关技能的同学,更好的理解和掌握Java并发编程的相关知识,更好的应对面试机会和挑战

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...

    java-数据库系统原理.docx

    数据库系统原理 事务 概念 事务是逻辑上的一组操作,要么都执行,要么都不执行。 特性 ACID 1. 原子性(Atomicity) 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。 回滚可以用...

    并发编程实战和原理讲解

    并发编程实战和原理讲解。该课程主要讲解并发的意义和并发实战,...本课程适合想要在Java并发上有本质提升的同学,适合对并发了解但不够深入的同学。 对于有了一定基础,但是忘记了又想回过头重新深入的同学同样适合。

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

Global site tag (gtag.js) - Google Analytics