日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 线程安全问题_java线程安全问题原因及解决办法

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 线程安全问题_java线程安全问题原因及解决办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.為什么會出現線程安全問題

計算機系統資源分配的單位為進程,同一個進程中允許多個線程并發執行,并且多個線程會共享進程范圍內的資源:例如內存地址。當多個線程并發訪問同一個內存地址并且內存地址保存的值是可變的時候可能會發生線程安全問題,因此需要內存數據共享機制來保證線程安全問題。

對應到java服務來說,在虛擬中的共享內存地址是java的堆內存,比如以下程序中線程安全問題:

public class ThreadUnsafeDemo {

private static final ExecutorService EXECUTOR_SERVICE;

static {

EXECUTOR_SERVICE = new ThreadPoolExecutor(100, 100, 1000 * 10,

TimeUnit.SECONDS, new LinkedBlockingQueue(100), new ThreadFactory() {

private AtomicLong atomicLong = new AtomicLong(1);

@Override

public Thread newThread(Runnable r) {

return new Thread(r, "Thread-Safe-Thread-" + atomicLong.getAndIncrement());

}

});

}

public static void main(String[] args) throws Exception {

Map params = new HashMap<>();

List futureList = new ArrayList<>(100);

for (int i = 0; i < 100; i++) {

futureList.add(EXECUTOR_SERVICE.submit(new CacheOpTask(params)));

}

for (Future future : futureList) {

System.out.println("Future result:" + future.get());

}

System.out.println(params);

}

private static class CacheOpTask implements Callable {

private Map params;

CacheOpTask(Map params) {

this.params = params;

}

@Override

public Integer call() {

for (int i = 0; i < 100; i++) {

int count = params.getOrDefault("count", 0);

params.put("count", ++count);

}

return params.get("count");

}

}

}

創建100個task,每個task對map中的元素累加100此,程序執行結果為:

{count=9846}

而預期的正確結果為:

{count=10000}

至于出現這種問題的原因,下面會具體分析。

判斷是否有線程安全性的一個原則是:

是否有多線程訪問可變的共享變量

2.多線程的優勢

發揮多處理器的強大能力,提高效率和程序吞吐量

3.并發帶來的風險

使用并發程序帶來的主要風險有以下三種:

3.1.安全性問題:

競態條件:由于不恰當的執行時序而出現不正確的結果

對于1中的線程安全的例子就是由于競態條件導致的最終結果與預期結果不一致。關鍵代碼塊如下:

int count = params.getOrDefault("count", 0);

params.put("count", ++count);

當多個線程同時取的count的值的時候,每個線程計算之后,在寫入到count,這時候會出現多個線程值被覆蓋的情況,最終導致結果不正確。

如下圖所示:

3.2解決此類問題的幾種方法

1.使用同步機制限制變量的訪問:鎖

比如:

synchronized (LOCK) {

int count = params.getOrDefault("count", 0);

params.put("count", ++count);

}

2.將變量設置為不可變

即將共享變量設置為final

3.不在線程之間共享此變量ThreadLocal

編程的原則:首先編寫正確的代碼,然后在實現性能的提升

無狀態的類一定是線程安全的

3.3 內置鎖

內置鎖:同步代碼塊( synchronized (this) {})

進入代碼塊前需要獲取鎖,會有性能問題。內置鎖是可重入鎖,之所以每個對象都有一個內置鎖,是為了避免顯示的創建鎖對象

常見的加鎖約定:將所有的可變狀態都封裝在對象內部,并使用內置鎖對所有訪問可變狀態的代碼進行同步。例如:Vector等

同步的另一個功能:內存可見性,類似于volatile

非volatile的64位變量double、long:

JVM允許對64位的操作分解為兩次32位的兩次操作,可變64位變量必須用volatile或者鎖來保護

加鎖的含義不僅在于互斥行為,還包括內存可見性,為了所有線程都可以看到共享變量的最新值,所有線程應該使用同一個鎖

原則:

除非需要跟高的可見性,否則應該將所有的域都聲明為私有的,除非需要某個域是可變的,否則應該講所有的域生命為final的

2.活躍性問題

線程活躍性問題主要是由于加鎖不正確導致的線程一直處于等待獲取鎖的狀態,比如以下程序:

public class DeadLock {

private static final Object[] LOCK_ARRAY;

static {

LOCK_ARRAY = new Object[2];

LOCK_ARRAY[0] = new Object();

LOCK_ARRAY[1] = new Object();

}

public static void main(String[] args) throws Exception {

TaskOne taskOne = new TaskOne();

taskOne.start();

TaskTwo taskTwo = new TaskTwo();

taskTwo.start();

System.out.println("finished");

}

private static class TaskOne extends Thread {

@Override

public void run(){

synchronized (LOCK_ARRAY[0]) {

try {

Thread.sleep(3000);

} catch (Exception e) {

}

System.out.println("Get LOCK-0");

synchronized (LOCK_ARRAY[1]) {

System.out.println("Get LOCK-1");

}

}

}

}

private static class TaskTwo extends Thread {

@Override

public void run() {

synchronized (LOCK_ARRAY[1]) {

try {

Thread.sleep(1000 * 3);

} catch (Exception e) {

}

System.out.println("Get LOCK-1");

synchronized (LOCK_ARRAY[0]) {

System.out.println("Get LOCK-0");

}

}

}

}

}

在兩個線程持有一個鎖,并在在鎖沒有釋放之前,互相等待對方持有的鎖,這時候會造成兩個線程會一直等待,從而產生死鎖。在我們使用鎖的時候應該考慮持有鎖的時長,特別是在網絡I/O的時候。

在使用鎖的時候要盡量避免以上情況,從而避免產生死鎖

3.性能問題

在使用多線程執行程序的時候,在線程間的切換以及線程的調度也會消耗CPU的性能。

總結

以上是生活随笔為你收集整理的java 线程安全问题_java线程安全问题原因及解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 97在线视频免费观看 | 波多野结衣www | 国产视频一区二区三区四区五区 | 色网av| 天天爽夜夜 | 一道本久在线中文字幕 | 亚洲色图一区二区三区 | 午夜精品区| 91色在线 | 日本电影大尺度免费观看 | 日韩欧av| 精品少妇av| 欧美精品免费一区二区 | 国产精品伦| 一区二区三区国产精品 | 可以免费看的av网站 | 午夜在线观看视频 | 国产美女精品久久久 | 女人天堂网站 | 亚洲第一在线 | 吻胸摸激情床激烈视频 | 亚洲手机在线 | 亚洲午夜精品久久久久久人妖 | 色呦呦视频 | 久久久久久久一区二区三区 | 蜜桃成人在线视频 | 日韩一区二区在线免费观看 | 国产精品伦子伦免费视频 | 饥渴少妇色诱水电工 | 中文字幕av一区二区三区人妻少妇 | 韩国日本中文字幕 | 国产成人资源 | 色呦呦一区二区 | 日韩欧美亚洲一区 | 阿的白色内裤hd中文 | 亚洲天堂av线 | 91亚洲国产精品 | 91成人免费视频 | 久久精品在这里 | 亚洲国产精品福利 | 成人av入口 | 另类av小说 | zjzjzjzjzj亚洲女人 | 国产视频在线看 | 佐佐木明希电影 | 亚洲精品国产福利 | 成人激情四射网 | 麻豆porn| 91玉足脚交白嫩脚丫 | 午夜理伦三级理论 | 91免费视频 | 美女国产精品 | 精品人妻中文无码av在线 | 亚州精品毛片 | 亚洲成人www| chien国产乱露脸对白 | 三级中文字幕 | 欧美黄色大片网站 | 日韩欧美片 | 欧洲在线视频 | 欧洲女女同videos | 啪在线视频 | 日本天堂免费 | 亚洲一区二区三区免费在线观看 | 成人亚洲网站 | 91精品国产免费 | va在线观看 | 精品久久久久久久久久久aⅴ | 日操干 | 99精品视频在线播放免费 | 亚洲国产日韩一区无码精品久久久 | 久久久久国产精品无码免费看 | 潘金莲一级淫片a.aaaaa播放 | 波多野结衣在线 | 芭乐视频色 | 自拍偷拍亚洲视频 | 美女色av| 老司机在线精品视频 | 国产一区二区在线观看视频 | 大屁股白浆一区二区三区 | 亚洲日本中文字幕在线 | 日韩精品一区二区三区电影 | 色哟哟一区二区三区 | av黄色成人 | 激情插插插 | 嫩操影院 | 丁香激情网| 青青草在线免费 | 草女人视频 | 亚洲精品久久久久久久久久久久久 | 原创少妇半推半就88av | 中文字幕91爱爱 | 青娱乐伊人 | 靠逼网站在线观看 | 亚洲综合免费观看高清完整版 | 先锋影音av资源网 | 色妞网站 | 免费一级淫片aaa片毛片a级 | 久久久午夜视频 |