线程与进程的区别_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进程的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抓住 ChatGPT 爆红机遇,微软计划
- 下一篇: java break的用法_Java基础