使用執行緒安全的單個例項變數

2021-07-29 13:20:29 字數 1718 閱讀 2682

importorg.slf4j.logger;

importorg.slf4j.logge***ctory;

/*** created by csj on 2017/3/24.

* 非執行緒安全存在於例項變數,,方法內部的私有變數不存在非執行緒安全問題, 永遠都是執行緒安全的,這都是方法內部的變數是私有的特性造成的。

* 如果多個執行緒共同訪問

1個物件中的例項變數,有可能出現

"非執行緒安全

"問題,這個實驗是兩個執行緒同時訪問乙個沒有同步的方法,導致最後兩個

num=200**/

public classhasselfprivatenumelse

logger.info("name={},num={}",name,num);

}catch(interruptedexception e) }}

/*** created by csj on 2017/3/25.

*/public classthreadaextendsthread

@override

public voidrun()

}/**

* created by csj on 2017/3/25.

*/public classthreadbextendsthread

@override

public voidrun()

}/**

* created by csj on 2017/3/25.

* */

public classrun

2017-03-26 10:23:37.893 [thread-0] info  hasselfprivatenum - a set over!

2017-03-26 10:23:39.903 [thread-0] info  hasselfprivatenum - name=a, num=100

2017-03-26 10:23:39.907 [thread-1] info  hasselfprivatenum - b set over

2017-03-26 10:23:39.907 [thread-1] info  hasselfprivatenum - name=b, num=200

根據日誌顯示:thread-0 對addname() 訪問結束(這個過程包含執行緒沉睡2s)後thread-1才可以訪問 addname(),這個是使用了synchronized 的效果,

倘若沒有使用的synchronized,建議把

int num=0

;放到addname() 中,這樣也是執行緒安全的;如果既沒有使用synchronized,又沒有把int num=0

;放到addname() 中,最後兩個執行緒的 num 都會是200,

例項變數與執行緒安全

public class mythread extends thread main方法跑一下 列印結果顯示,執行緒1,3,2列印的count的值都是3,產生了非執行緒安全問題。當thread 1執行count 時,分幾步完成 1 把count的值從主存中複製乙份到快取記憶體中 2 對count進行 ...

多執行緒 例項變數與執行緒安全

自定義執行緒類中的例項變數針對其他執行緒有共享和不共享之分,這在多個執行緒之間進行互動時是乙個很重要的技術點。不共享資料的情況 下面通過乙個示例來看下資料不共享的情況。package com.vhqimk.thread 測試資料不共享的情況 public class test class mythr...

2 1 2例項變數非執行緒安全

package cha02.execise02 created by sunyifeng on 17 9 20.public class hasselfprivatenum else system.out println username num num catch interruptedexcep...