线程

进程和线程的区别

  1. 串行:初期的计算机只能串行执行任务,大量时间等待用户输入
  2. 批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行
  3. 进程:进程独占内存空间,保存各自运行状态,互相之间不相互干扰,为并发处理任务提供了可能、
  4. 线程:共享进程的内存资源,相互间切换状态,支持更细细度的控制

进程是资源分配的最小单位,线程是CPU资源分配的基本单位

  • 所有与进程相关的资源,都被记录在PCB中
  • 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源
  • 线程只有堆栈寄存器、程序计数器和TCB组成

  • 线程不能看做独立的应用,而进程可以看做独立的应用
  • 进程有独立的地址空间,相互之间不影响,线程只是进程的不同执行路径
  • 线程没有独立的地址空间,多进程的程序比多线程的程序更加健壮
  • 进程的切换比线程的切换开销大

Java进程和线程的关系

  • Java对操作系统提供功能的封装,包含进程和线程
  • 运行一个程序会产生一个进程,进程至少包含一个线程
  • 每个进程对应一个JVM实例,多个线程共享JVM里的堆
  • Java采用单线程模型编程,程序会自动创建主进程

Sleep和Wait的区别

  • sleep是Thread类的方法,wait是Object类定义的方法
  • sleep可以在任何方法中使用,wait方法需要获取到锁才能使用也就是sychronized中使用

主要区别

  • sleep会让出CPU,不会导致锁行为的改变
  • Object.wait不仅会让出锁,还会释放同步资源

synchronized底层实现原理

  • Monitor:每个Java对象天生有个Monito锁
  • Monitor锁的竞争和释放

  • 早期版本的synchronized使用操作系统的Mutex Lock;
  • 用户态切换到系统态很慢

自旋锁与自适应锁

自旋锁

  • 许多情况下,共享资源占用的时间是很短的,切换线程不值得
  • 通过让线程执行忙循环等待锁的释放,不让出CPU
  • 缺点:如果线程占用锁的时间过长,会带来性能上的开销

自适应锁

  • 自旋的次数不在固定
  • 由前一次在同一个锁上的自旋次数及锁拥有者的状态来决定

锁消除

  • 在JIT期间,消除程序中不可能出现锁竞争代码锁申请的锁

锁粗化

消除对同一方法中同时多次加锁

锁膨胀

无锁→偏向锁→轻量锁→重量锁

一般情况下是不可退化的

偏向锁

核心思想:

​ 如果一个线程获得了锁,锁进入偏向模式,此时Mark Word的结构也变为偏向结构,当该线程再次请求锁时,无需在做任何同步操作,即获取锁的过程中只需要检查Mark Word的锁标记位为偏向锁以及当前线程的ID等于Mark Word的Thread ID即可,可以省去大量申请锁的时间

轻量锁

核心思想:

​ 轻量级锁是有偏向锁膨胀而来,在一个线程进入同步块的情况下,另外一个线程也进入同步块,发生锁争用就会转为轻量级锁

若存在多个线程竞争同步块,会膨胀为重量锁

优点 缺点 使用范围
偏向锁 加锁和解锁不需要采用CAS操作,没有额外的性能消耗,和执行非同步方法相比仅差纳秒级 如果线程之间存在锁的竞争,会带来额外的消耗 只有一个线程访问同步块或者同步代码的情况
轻量锁 竞争的线程不阻塞,提高了响应速度 若线程长时间抢不到锁,自旋会影响CPU性能 线程交替执行同步代码或者同步方法的情况
重量锁 线程竞争不会自旋,不会消耗CPU 线程阻塞,响应时间缓慢,在多线程的情况下,频繁的获取释放锁,会带来巨大的性能消耗 追求吞吐量,同步块或者同步时间较长的场景

锁的内存定义

​ 当线程释放锁时,Java内存模型会把线程对应的本地内存变量刷新到主内存中

​ 而当线程获取锁时,Java内存模型会把线程获取的主内存空间设置为无效,从而使得被监视器保护的临界区代码必须从主内存中读取共享变量

线程概要 Java的更多相关文章

  1. 【Java中的线程】java.lang.Thread 类分析

    进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...

  2. 看我是如何处理自定义线程模型---java

    看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoar ...

  3. Java 线程 — JMM Java内存模型

    JMM Java Memory Model,Java内存模型,属于语言级的内存模型 并发编程中存在的问题: 如何通信:用于线程之间交换信息.两种方式:共享内存,消息传递 如何同步:用于控制不同线程间操 ...

  4. 线程池——JAVA并发编程指南

    TPS00-J. 用线程池实现应用在流量暴涨时优雅降级 很多程序都要解决这样一个问题——处理一系列外来的请求.Thread- Per-Message这种设计模式是最简单的并发策略了,它为每一个请求创建 ...

  5. 【Java线程】Java线程池ExecutorService

    示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.u ...

  6. 死锁线程探讨Java中的死锁现象

    题记:写这篇博客要主是加深自己对死锁线程的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 今天搞了一下Java的死锁机制,感到自己还是不怎么懂,所以就从一些简略的源代码中琢磨:我先 ...

  7. .进程&线程(&java.lang.Thread)详解

    一.进程与线程 进程 我们在进行操作电脑的时候,通常会打开浏览器,通讯工具等应用程序,这个时候CPU通过作业调度在内存中就会分配一些空间让它们处于宏观上的运行状态(处于可以被CPU执行的状态),而这部 ...

  8. 线程(java课堂笔记)

    1.两种方式的差异 2.线程的生命周期 3.线程控制(线程的方法) 4.线程同步 5.线程同步锁 一. 两种方式的差异 A extends Thread :简单 不能再继承其他类了(Java单继承)同 ...

  9. 【Java线程】Java内存模型总结

    学习资料:http://www.infoq.com/cn/articles/Java-memory-model-1 Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态, ...

随机推荐

  1. MySQL数据库篇之完整性约束和表关系

    主要内容: 一.完整性约束 二.表关系 1️⃣ 完整性约束 (1)何为完整性约束? 约束条件与数据类型的宽度一样,都是可选参数. 作用:用于保证数据的完整性和一致性 (2)分类主要有以下五类: 1.n ...

  2. Core 第三组 结对作业——四则运算 Part1. Core代码编写

    结对作业——四则运算 Part1. Core代码编写 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 (因为内容较多,分为了三个部分,但作业系统中只能提交一 ...

  3. Android开发实战之补间动画和属性动画

    说起动画,其实一点也不陌生,在使用一款app的时候为了优化用户体验,多多少少的,都会加入动画. 安卓中的动画,分为两大类:补间动画和属性动画.本篇博文会详细介绍总结这两大动画,希望本篇博文对你的学习和 ...

  4. 基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)

    https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自 ...

  5. 为什么要用Android Studio?

    为什么要用Android Studio 本书节选自<Android Studio实用指南> 作者: 毕小朋 目前本书已上传到百度阅读,在百度中搜索[Anroid Studio实用指南]便可 ...

  6. Linux显示文件前几行、拷贝文件前几行、删除文件前几列

    [一]显示文件前几行 ll -lrth:按照更改时间倒序排列,最新文件在下边 ll -lrSh:按照文件大小倒序排列,最大文件在下边 grep --color :高亮查询关键字 grep -A 10 ...

  7. 小程序本地资源无法通过 css 获取

    background-image:可以使用网络图片,或者 base64,或者使用<image/>标签

  8. Tomcat安装 以Linux 分支 Ubuntu Server 为例

    以Linux 分支 Ubuntu Server 为例.一.相关目录及作用说明 /etc/tomcat6 - 全局配置 /usr/share/tomcat6/ - 程序主目录 /usr/share/to ...

  9. ubuntu Qt5 librealsense opencv

    08:11:47: 进程"/usr/bin/make"正常退出. 08:11:47: 配置没有改变, 跳过 qmake 步骤. 08:11:47: 正在启动 "/usr/ ...

  10. freemaker 优缺点 及 应用配置

    通俗的讲,freemaker其实就是一个模板引擎.什么意思呢?——Java可以基于依赖库,然后在模板上进行数据更改(显示). 在模板中,您专注于如何呈现数据,而在模板外(后台业务代码),您将专注于呈现 ...