并發(fā)編程的目的是讓程序運(yùn)行更快,但是使用并發(fā)并不定會(huì)使得程序運(yùn)行更快,只有當(dāng)程序的并發(fā)數(shù)量達(dá)到一定的量級(jí)的時(shí)候才能體現(xiàn)并發(fā)編程的優(yōu)勢(shì)。所以談并發(fā)編程在高并發(fā)量的時(shí)候才有意義。雖然目前還沒(méi)有開(kāi)發(fā)過(guò)高并發(fā)量的程序,但是學(xué)習(xí)并發(fā)是為了更好理解一些分布式架構(gòu)。那么當(dāng)程序的并發(fā)量不高,比如是單線程的程序,單線程的執(zhí)行效率反而比多線程更高。這又是為什么呢?熟悉操作系統(tǒng)的應(yīng)該知道,CPU是通過(guò)給每個(gè)線程分配時(shí)間片的方式實(shí)現(xiàn)多線程的。這樣,當(dāng)CPU從一個(gè)任務(wù)切換到另一個(gè)任務(wù)的時(shí)候,會(huì)保存上一個(gè)任務(wù)的狀態(tài),當(dāng)執(zhí)行完這個(gè)任務(wù)的時(shí)候CPU就會(huì)繼續(xù)上一個(gè)任務(wù)的狀態(tài)繼續(xù)執(zhí)行。這個(gè)過(guò)程稱為上下文切換。
創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、南陽(yáng)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為南陽(yáng)等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。在Java多線程中,volatile關(guān)鍵字個(gè)synchronized關(guān)鍵字扮演了重要的角色,它們都可以實(shí)現(xiàn)線程的同步,但是在底層是如何實(shí)現(xiàn)的呢?
volatile
volatile只能保證變量對(duì)各個(gè)線程的可見(jiàn)性,但不能保證原子性。關(guān)于 Java語(yǔ)言 volatile 的使用方法就不多說(shuō)了,我的建議是 除了 配合package java.util.concurrent.atomic 中的類庫(kù),其他情況一概別用。更多的解釋 參見(jiàn) 這篇文章。
引子
參見(jiàn)如下代碼
package org.go; public class Go { volatile int i = 0; private void inc() { i++; } public static void main(String[] args) { Go go = new Go(); for (int i = 0; i < 10; i++) { new Thread(() -> { for (int j = 0; j < 1000; j++) go.inc(); }).start(); } while(Thread.activeCount()>1){ Thread.yield(); } System.out.println(go.i); } }