實(shí)例講解Java并發(fā)編程之變量
編寫線程安全需要關(guān)心的:
1.共享的變量
2.可變的變量
共享意味著多個(gè)線程可以同時(shí)訪問(wèn),可變意味著其值在生命周期可以改變。
例如以下count 變量:
//線程不安全的類
public class UnsafeCount {
private int count = 0; //該變量是共享的
public void increase() { //這里沒(méi)有同步機(jī)制,多個(gè)線程可以同時(shí)訪問(wèn)
count++; //該變量是可變的
}
public int getCount() {
return count;
}
}
有4種方式可以修復(fù)這個(gè)問(wèn)題:
1.不在線程中共享該狀態(tài)變量,可以將變量封裝到方法中(無(wú)狀態(tài)的對(duì)象一定是線程安全的);因?yàn)榉椒ㄖ凶兞渴敲總€(gè)線程獨(dú)占的,不和其它線程共享。比如:
public int add(int count){
return ++count;//這里也可以說(shuō)無(wú)狀態(tài)的對(duì)象一定是線程安全的
}
2.將狀態(tài)變量修改為不可變的變量。
private final int count = 0;
3.在訪問(wèn)狀態(tài)變量使用同步策略。
public synchronized void increase() {
count++;
}
4.使用原子變量類。
private AtomicInteger count;
public void increase() {
count.getAndAdd(1);
}
相關(guān)文章
Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解
這篇文章主要介紹了Mybatis 動(dòng)態(tài)表名+Map參數(shù)傳遞+批量操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12一文帶你深入了解Java的數(shù)據(jù)結(jié)構(gòu)
Java工具包提供了強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)。這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中常用的幾種接口和類,感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05Java 數(shù)據(jù)結(jié)構(gòu)之堆的概念與應(yīng)用
堆是一顆完全二叉樹,在這棵樹中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆,堆雖然是一顆樹,但是通常存放在一個(gè)數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過(guò)數(shù)組下標(biāo)來(lái)確定2021-10-10Java面向?qū)ο缶幊蹋ǚ庋b/繼承/多態(tài))實(shí)例解析
這篇文章主要介紹了Java面向?qū)ο缶幊蹋ǚ庋b/繼承/多態(tài))實(shí)例解析的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10從零搭建SpringBoot+MyBatisPlus快速開發(fā)腳手架
這篇文章主要為大家介紹了從零搭建SpringBoot+MyBatisPlus快速開發(fā)腳手架示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06關(guān)于對(duì)Java正則表達(dá)式"\\"的理解
正則表達(dá)式中,\代表轉(zhuǎn)義字符,通常是轉(zhuǎn)義一些特殊字符,下面這篇文章主要給大家介紹了關(guān)于對(duì)Java正則表達(dá)式"\\"的相關(guān)理解,需要的朋友可以參考下2022-09-09eclipse配置tomcat10的詳細(xì)步驟總結(jié)
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著eclipse配置tomcat10的詳細(xì)步驟展開,文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下2021-06-06