线程与进程的区别_Java线程和PC进程的区别
进程和线程的区别
- 进程:资源分配的基本单位,多存在于操作系统任务中
- 线程:资源调度的基本单位,一般存在于某个程序中
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进程的区别相关推荐
- java线程主要状态及转换_Java线程状态转换及控制
线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...
- java线程池的面试题_java线程池 面试题(精简)
什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理. 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线 ...
- java 线程栈 公享变量_Java线程:线程栈模型与线程的变量
Java线程:线程栈模型与线程的变量 要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动 ...
- java线程池的工作原理_Java 线程池的介绍以及工作原理
在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2. 提高响应速度 ...
- 线程池 java 新建方式_Java线程池的四种创建方式
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...
- java线程池有什么作用_java线程池的作用是什么?线程池介绍
你知道java中线程池的作用是什么吗?那么究竟什么是线程池呢?都有哪些类型呢?让我们对以上的问题来进行详细的了解吧. 一.java线程池作用 第一个我们先来对它的作用进行一下简单的介绍,使用线程池的优 ...
- java线程池的工作原理_JAVA线程池原理详解一
线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线 ...
- java中线程死锁的解决方法_Java线程死锁实例及解决方法
这篇文章主要介绍了Java线程死锁实例及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.死锁的定义 所谓死锁是指多个线程因竞争资源而造成 ...
- java 线程 wait 一定要同步_Java 线程中调用wait为什么一定要在同步代码块中?
展开全部 wait是让使用wait方法的对象等待,暂时先把对象锁给让出来,给其它持有该锁的对象用,其它对象用完后再636f707962616964757a686964616f3133333739623 ...
最新文章
- 2022-2028年中国亲子游行业市场分析及前瞻研究报告
- arm linux 启动之一:汇编启动到start_kernel
- 软件框架设计的艺术----读书总结
- 2020-09-05
- Pymol BioPython | PDB文件中氨基酸序列的提取
- Java针对ArrayList自定义排序的2种实现方法
- java application程序_如何Java编写的application程序像exe一样方便shy;的运行
- 《区块链技术指南》一
- 在文华财经赢顺云W6和赢顺云手机随身行中如何导入需要的指标
- 今天修改包名时出现 java.lang.ClassNotFoundException: com.myandroid.qqlogin1.MainActivity错误
- ARM处理器开发详解
- Android学习之——APP番茄工作法——小结(2)
- 【转】蜗牛求职记之华为篇
- 图解Linux中EXT4与EXT3的区别
- nginx关闭/重启/启动的操作方法
- 配置AD域环境、OU、GPO
- Elastic Search创建文档和更新文档
- java apache 工具类,超实用的apache Java 工具类
- oracle 取农历函数,Oracle中如何将日期转换成农历
- 武田呈报的ALK+ NSCLC长期数据显示,ALUNBRIG(R) (brigatinib)在2年随访期之后继续展示一线治疗中的优效性
热门文章
- mysql 原生 添加数据_手撸Mysql原生语句--增删改查
- 【计算机组成原理】数据表示和运算
- python时间模块使用教程_Python datetime模块使用方法小结
- Java学习笔记_数组
- Linux软件包管理的知识点,Linux基础知识之软件包管理(二)
- 同步电路出现异步清零可以吗_异步计数器 || 计数器的分类 ||异步二进制十进制|| 74290 8421 5421 || 数电...
- 用于安装python第三方库的工具是_Python第三方库安装
- 操作系统磁盘空闲管理之位示图法
- 最短路径生成树计数+最短路径生成树
- S3C2440中断跳转分析