《Java 高并发》02 多线程的特性
多線程的三大特性:原子性、可見(jiàn)性和有序性。
原子性
原子性是指一個(gè)操作或者多個(gè)操作,一旦開(kāi)始就不會(huì)被其他線程干擾,即使是在多個(gè)線程一起執(zhí)行的情況下也不會(huì)被干擾。或者不執(zhí)行。
原子性主要是為了保證數(shù)據(jù)一致,線程安全問(wèn)題。
可見(jiàn)性
可見(jiàn)性是指當(dāng)一個(gè)線程修改了某一個(gè)共享變量的值,其他線程是否能夠立即知道這個(gè)修改。
對(duì)于串行程序來(lái)說(shuō),可見(jiàn)性問(wèn)題是不存在的。因?yàn)槟阍谌魏我粋€(gè)操作步驟中修改了某個(gè)變量,那么后續(xù)的步驟中,讀取這個(gè)變量的值一定是修改后的新值。
對(duì)于并行程序來(lái)說(shuō)就可能存在了。如果存在兩個(gè)線程:線程1、線程2,共享變量:t,線程1 為了優(yōu)化獲取共享變量速度將共享變量存放在緩存中,此時(shí)線程2 對(duì)共享變量進(jìn)行修改,那么線程1 又無(wú)法意識(shí)到這個(gè)改動(dòng),依然從緩沖中獲取數(shù)據(jù)。因此,就產(chǎn)生了可見(jiàn)性問(wèn)題。
除了上述提到的緩存優(yōu)化會(huì)導(dǎo)致可見(jiàn)性問(wèn)題,指令重拍以及編輯器的優(yōu)化,都有可能導(dǎo)致一個(gè)線程的修改不會(huì)立即被其他線程察覺(jué)。
有序性
有序性問(wèn)題可能是三個(gè)問(wèn)題中最難理解的了。對(duì)于一個(gè)線程的執(zhí)行代碼而言,是一次執(zhí)行的。但是,在并發(fā)是,程序的執(zhí)行可能就會(huì)出現(xiàn)亂序。
public class OrderTest {int a = 0;boolean flag = false;public void writer(){a = 1;flag = true;}public void reader(){if (!flag){System.out.println(a);}}}假設(shè)有兩個(gè)線程:A、B,線程A 先執(zhí)行 writer 方法,接著線程B 執(zhí)行 reader 方法,此時(shí)線程B 不一定能打印 a 。
總結(jié)
以上是生活随笔為你收集整理的《Java 高并发》02 多线程的特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spring mvc学习(24):配置m
- 下一篇: 2022-Java面试宝典收藏版