线程与进程的区别_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

b7b0f2c0aa101edd473d06f1380c321b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值