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...