日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

线程与进程的区别_Java线程和PC进程的区别

發布時間:2023/12/15 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程与进程的区别_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进程的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。