进程和线程的区别

  • 进程:资源分配的基本单位,多存在于操作系统任务中
  • 线程:资源调度的基本单位,一般存在于某个程序中

JVM

主内存与工作内存间具体的交互

A:作用范围主内存变量

B:作用范围工作内存变量

lock(锁定)

A,将变量标识成线程独有

unlock(解锁)

A,解锁变量,解锁后的变量才能被其他线程锁定

read(读取)

A,把变量的值从主内存传输到线程工作内存中以便load动作使用

load(加载)

B,将read操作从主内存中获取到的变量值放入工作内存的变量副本

use(使用)

B,将工作内存中变量的值传递给执行引擎

assign(赋值)

B,接收从执行引擎传递的值赋值给工作内存变量

store(存储)

B,将工作内存中的变量的值传送到主内存,方便write操作使用

write(写入)

A,将store操作从工作内存中得到的变量值放入主内存变量中

  • 线程模型 OS Kernel Thread
  • Hotspot模型

Mark Word(对象哈希码、GC标志、GC年龄、同步锁)信息

Klass Point(指向存储类型元数据的指针)

字节对齐的填充数据

CAS(轻量级锁)

  • compare and swap(比较和交换)
  • compare and exchange(比较和交换)
  • compare and set(比较和设置)ABA问题

偏向锁(已在JDK最高版本中去除):

时延默认4秒

自旋锁:

轻量级锁:

需要消耗CPU资源

重量级锁:

通过操作系统(OS)管理,不需要消耗CPU资源

CPU 缓存 内存

缓存行:Cache Line,

缓存一致性协议 ,多处理系统共享主内存,缓存数据时可能导致缓存数据不一致,所要遵循的协议:MESI、MSI、MOSI、Synapse、Firefly和Dragon Protocol

FalseSharing(伪共享)

缓存行中,多线程修改相互独立的变量时,如果变量恰好存在于同一个缓存行,会影响(写回、无效化或者同步)导致性能降低

Volatile(轻量级同步机制)

  • 保持线程可见性
  • 禁止指令重排序

java中运算并非原子操作,将会导致volatile变量的运算在并发模式下一样不安全。

 public class VolatileTest { //  变量     private static volatile int rcc = 0; //  测试线程数量     private static final int THREAD_COUNT = 20;      public static void inc() {         rcc++;     }      public static void main(String[] args){         Thread[] threads = new Thread[THREAD_COUNT];         for (int i = 0; i < THREAD_COUNT; i++) {             threads[i] = new Thread(()->{                 for (int i1 = 0; i1 < 10000; i1++) {                     inc();                 }             });             threads[i].start();         }         while(Thread.activeCount() > 1){             Thread.yield();         }         System.out.println(rcc);     } }

最后输出的结果不正确

 package com.flowable.ums.thread; ​ import java.util.concurrent.atomic.AtomicInteger; ​ public class VolatileTest {     //  变量     private static AtomicInteger rcc = new AtomicInteger(0);     static void inc() {         rcc.incrementAndGet();     }     public static final int THREAD_COUNT = 20;     public static void main(String[] args) {         Thread[] threads = new Thread[THREAD_COUNT];         for (int i = 0; i < THREAD_COUNT; i++) {             threads[i] = new Thread(()->{                 for (int i1 = 0; i1 < 10000; i1++) {                     inc();                 }             });             threads[i].start();         }         while (Thread.activeCount() > 1) {             Thread.yield();         }         System.out.println(rcc);     } }

线程通信

LockSupport.park() 和 unpark()

ReentrantLock(锁) & Condition(队列)

TransferQueue(交换队列)


Atomic::cmpxchg

线程与进程的区别_Java线程和PC进程的区别相关推荐

  1. java线程主要状态及转换_Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

  2. java线程池的面试题_java线程池 面试题(精简)

    什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理. 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线 ...

  3. java 线程栈 公享变量_Java线程:线程栈模型与线程的变量

    Java线程:线程栈模型与线程的变量 要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动 ...

  4. java线程池的工作原理_Java 线程池的介绍以及工作原理

    在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2. 提高响应速度 ...

  5. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  6. java线程池有什么作用_java线程池的作用是什么?线程池介绍

    你知道java中线程池的作用是什么吗?那么究竟什么是线程池呢?都有哪些类型呢?让我们对以上的问题来进行详细的了解吧. 一.java线程池作用 第一个我们先来对它的作用进行一下简单的介绍,使用线程池的优 ...

  7. java线程池的工作原理_JAVA线程池原理详解一

    线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线 ...

  8. java中线程死锁的解决方法_Java线程死锁实例及解决方法

    这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.死锁的定义 所谓死锁是指多个线程因竞争资源而造成 ...

  9. java 线程 wait 一定要同步_Java 线程中调用wait为什么一定要在同步代码块中?

    展开全部 wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有该锁的对象用,其它对象用完后再636f707962616964757a686964616f3133333739623 ...

最新文章

  1. 2022-2028年中国亲子游行业市场分析及前瞻研究报告
  2. arm linux 启动之一:汇编启动到start_kernel
  3. 软件框架设计的艺术----读书总结
  4. 2020-09-05
  5. Pymol BioPython | PDB文件中氨基酸序列的提取
  6. Java针对ArrayList自定义排序的2种实现方法
  7. java application程序_如何Java编写的application程序像exe一样方便shy;的运行
  8. 《区块链技术指南》一
  9. 在文华财经赢顺云W6和赢顺云手机随身行中如何导入需要的指标
  10. 今天修改包名时出现 java.lang.ClassNotFoundException: com.myandroid.qqlogin1.MainActivity错误
  11. ARM处理器开发详解
  12. Android学习之——APP番茄工作法——小结(2)
  13. 【转】蜗牛求职记之华为篇
  14. 图解Linux中EXT4与EXT3的区别
  15. nginx关闭/重启/启动的操作方法
  16. 配置AD域环境、OU、GPO
  17. Elastic Search创建文档和更新文档
  18. java apache 工具类,超实用的apache Java 工具类
  19. oracle 取农历函数,Oracle中如何将日期转换成农历
  20. 武田呈报的ALK+ NSCLC长期数据显示,ALUNBRIG(R) (brigatinib)在2年随访期之后继续展示一线治疗中的优效性

热门文章

  1. mysql 原生 添加数据_手撸Mysql原生语句--增删改查
  2. 【计算机组成原理】数据表示和运算
  3. python时间模块使用教程_Python datetime模块使用方法小结
  4. Java学习笔记_数组
  5. Linux软件包管理的知识点,Linux基础知识之软件包管理(二)
  6. 同步电路出现异步清零可以吗_异步计数器 || 计数器的分类 ||异步二进制十进制|| 74290 8421 5421 || 数电...
  7. 用于安装python第三方库的工具是_Python第三方库安装
  8. 操作系统磁盘空闲管理之位示图法
  9. 最短路径生成树计数+最短路径生成树
  10. S3C2440中断跳转分析