线程与进程的区别_Java线程和PC进程的区别
進程和線程的區(qū)別
- 進程:資源分配的基本單位,多存在于操作系統(tǒng)任務中
- 線程:資源調(diào)度的基本單位,一般存在于某個程序中
JVM
主內(nèi)存與工作內(nèi)存間具體的交互
A:作用范圍主內(nèi)存變量
B:作用范圍工作內(nèi)存變量
lock(鎖定)
A,將變量標識成線程獨有
unlock(解鎖)
A,解鎖變量,解鎖后的變量才能被其他線程鎖定
read(讀取)
A,把變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程工作內(nèi)存中以便load動作使用
load(加載)
B,將read操作從主內(nèi)存中獲取到的變量值放入工作內(nèi)存的變量副本
use(使用)
B,將工作內(nèi)存中變量的值傳遞給執(zhí)行引擎
assign(賦值)
B,接收從執(zhí)行引擎?zhèn)鬟f的值賦值給工作內(nèi)存變量
store(存儲)
B,將工作內(nèi)存中的變量的值傳送到主內(nèi)存,方便write操作使用
write(寫入)
A,將store操作從工作內(nèi)存中得到的變量值放入主內(nèi)存變量中
- 線程模型 OS Kernel Thread
- Hotspot模型
Mark Word(對象哈希碼、GC標志、GC年齡、同步鎖)信息
Klass Point(指向存儲類型元數(shù)據(jù)的指針)
字節(jié)對齊的填充數(shù)據(jù)
CAS(輕量級鎖)
- compare and swap(比較和交換)
- compare and exchange(比較和交換)
- compare and set(比較和設(shè)置)ABA問題
偏向鎖(已在JDK最高版本中去除):
時延默認4秒
自旋鎖:
輕量級鎖:
需要消耗CPU資源
重量級鎖:
通過操作系統(tǒng)(OS)管理,不需要消耗CPU資源
CPU 緩存 內(nèi)存
緩存行:Cache Line,
緩存一致性協(xié)議 ,多處理系統(tǒng)共享主內(nèi)存,緩存數(shù)據(jù)時可能導致緩存數(shù)據(jù)不一致,所要遵循的協(xié)議:MESI、MSI、MOSI、Synapse、Firefly和Dragon Protocol
FalseSharing(偽共享)
緩存行中,多線程修改相互獨立的變量時,如果變量恰好存在于同一個緩存行,會影響(寫回、無效化或者同步)導致性能降低
Volatile(輕量級同步機制)
- 保持線程可見性
- 禁止指令重排序
java中運算并非原子操作,將會導致volatile變量的運算在并發(fā)模式下一樣不安全。
?public class VolatileTest {?// 變量? ? ?private static volatile int rcc = 0;?// 測試線程數(shù)量? ? ?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);? ? }?}最后輸出的結(jié)果不正確
?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
總結(jié)
以上是生活随笔為你收集整理的线程与进程的区别_Java线程和PC进程的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抓住 ChatGPT 爆红机遇,微软计划
- 下一篇: 《鹅鸭杀》服务器屡遭攻击 官方宣布停服三